Clipboard.SetImage не работает

1

Я пытаюсь загрузить изображение из URL-адреса и установить его в буфер обмена (WPF). Я могу вставить изображение в Paint, но не в локальный каталог.

Вот мои загрузки и настройки кодов в буфер обмена:

var request = WebRequest.Create(urlImg); // urlImg  - url of image
var response = request.GetResponse();
var responseStream = response.GetResponseStream();
var bitmap2 = new Bitmap(responseStream);

var orgimg = LoadBitmap2(bitmap2); // converting to BitmapSource
Clipboard.SetImage(orgimg);
  • 1
    В чем ваша проблема и в чем заключается содержание urlImg?
  • 0
    urlImg - это простой URL-адрес изображения. Проблема в том, что я не могу вставить изображение в локальный каталог, но когда я попытался вставить его в Paint, оно вставлено.
Теги:
wpf
clipboard

1 ответ

2
Лучший ответ

Когда вы вырезаете/копируете и вставляете изображение в файловую систему, только пути находятся в данных буфера обмена.

Если вы хотите "вставить" загруженное изображение в каталог, вам нужно будет подражать этому поведению:

  1. Записать загруженное изображение в временную директорию
  2. Настройте буфер обмена с соответствующими данными пасты (см. DataFormats.FileDrop)
  3. Убедитесь, что режим установлен на "вырезать", чтобы изображение не оставалось в временном расположении

пример

string url = "http://example.com/images/someimage.jpeg";
var img = GetImageFromUrl(url);

//write the image to a temporary location (todo: purge it later)
var tmpFilePath = Path.Combine(Path.GetTempPath(), Path.GetFileName(url));
img.Save(tmpFilePath);

//group image(s)
var imgCollection = new System.Collections.Specialized.StringCollection();
imgCollection.Add(tmpFilePath);

//changing the drop affect to 'move' from the temp location
byte[] moveEffect = new byte[] { 2, 0, 0, 0 };
MemoryStream dropEffect = new MemoryStream();
dropEffect.Write(moveEffect, 0, moveEffect.Length);

//set up our clipboard data
DataObject data = new DataObject();
data.SetFileDropList(imgCollection);
data.SetData("Preferred DropEffect", dropEffect);

//push it all to the clipboard
Clipboard.Clear();
Clipboard.SetDataObject(data, true);

Где GetImageFromUrl():

private System.Drawing.Image GetImageFromUrl(string url)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);

    using (HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse())
    {
        using (Stream stream = httpWebReponse.GetResponseStream())
        {
            return System.Drawing.Image.FromStream(stream);
        }
    }
}

Примечание. Вам необходимо добавить ссылку на System.Drawing для класса Image. Я уверен, что есть альтернатива в пространствах WPF.

Дальнейшее чтение

  • 0
    Спасибо за быстрый ответ, это работает, но я не мог пройти мимо него дважды, я имею в виду, когда я пытался второй раз вставить то же изображение, которое не вставил.
  • 0
    Если вы хотите вставить несколько раз, вам нужно использовать «копировать» вместо «вырезать». Попробуйте удалить data.SetData("Preferred DropEffect", dropEffect); и связанный код, который устанавливает эффект «вырезания». ВАЖНО: Вы все равно должны удалить загруженные изображения из tmpFilePath после того, как пользователь закончит копировать их в определенные места.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню