wpf InteropBitmap to bitmap - PullRequest
       0

wpf InteropBitmap to bitmap

3 голосов
/ 24 мая 2011

У меня странная проблема. Я пытаюсь получить изображения, уже загруженные в веб-браузере. Следующий код прекрасно работает в приложении WinForms:

IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)__ie.NativeDocument.BODY).createControlRange();

            foreach (IHTMLImgElement img in __ie.NativeDocument.Images)
            {
                imgRange.add((IHTMLControlElement)img);
                imgRange.execCommand("Copy", false, null);

                System.IO.MemoryStream stream = new System.IO.MemoryStream();
                using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap))
                {
                        bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
                        var image = System.Drawing.Image.FromStream(stream);
                }
            }

Но тот же код, если я использую в приложении WPF, выдает ошибку на

using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().......

Ошибка выглядит следующим образом:

"Невозможно привести объект типа 'System.Windows.Interop.InteropBitmap' к типу 'System.Drawing.Bitmap'."

Как мне решить эту проблему?

Пожалуйста, кто-нибудь может дать любые указания.

Заранее спасибо.

1 Ответ

5 голосов
/ 24 мая 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что есть два разных класса Clipboard, один для WinForms и один для WPF. WinForms one возвращает растровые изображения, которые подходят для использования с WinForms, т.е. System.Drawing.Bitmap, который в используемом вами коде копирует его в System.Drawing.Image.

Эти типы растровых изображений бесполезны с WPF, поэтому ожидается, что тот факт, что вы не можете преобразовать то, что версия WPF класса Clipboard дает вам тип, который полезен с WinForms, является ожидаемым, а на самом деле не вашей проблемой.

Ваша проблема в том, что для WPF вам нужен тип растрового изображения, который вы можете использовать с WPF: a BitmapSource. Это то, что вы можете использовать с элементами управления WPF, такими как Image. Итак, вернемся к вашему вопросу:

  • если вы используете WPF4, вы можете использовать Clipboard.GetImage, который возвращает BitmapSource, именно то, что вам нужно
  • если вы используете что-то еще, вы можете использовать технику Томаса Левеска, описанную здесь

В итоге:

  • Для WinForms: буфер обмена WinForms => Растровые изображения WinForms
  • Для WPF: буфер обмена WPF => Растровые изображения WPF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...