WPF InteropBitmap 转换为 Bitmap

4

我遇到了一个奇怪的问题。我正在尝试检索WebBrowser控件中已加载的图像。以下代码在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个回答

8
您遇到的问题是存在两个不同的Clipboard类,一个用于WinForms,另一个用于WPF。 WinForms版本返回适用于WinForms的位图,即System.Drawing.Bitmap,在您使用的代码中将其复制到System.Drawing.Image中。
这些类型的位图对于WPF没有用处,因此您无法将WPF版本的Clipboard类提供给您的有用于WinForms的位图类型进行转换,这是预期的,也不是真正的问题。
您的问题是,在WPF中,您需要一种可以与WPF一起使用的位图类型:即BitmapSource。这是您可以在WPF控件(如Image)中使用的东西。 因此,回到您的问题:
  • 如果您正在使用WPF4,则可以使用Clipboard.GetImage,它返回BitmapSource,正是您所需的。
  • 如果您使用其他任何内容,则可以使用Thomas Levesque在此处描述的技术。
总之:
  • 对于WinForms:WinForms剪贴板 => WinForms位图
  • 对于WPF:WPF剪贴板 => WPF位图

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接