wpf InteropBitmap到位图

时间:2011-05-24 05:13:33

标签: c# .net wpf winforms browser

我遇到了一个奇怪的问题。我正在尝试检索已经加载到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 个答案:

答案 0 :(得分:5)

您遇到的问题是有两个不同的Clipboard类,一个用于WinForms,另一个用于WPF。 WinForms返回适合与WinForms一起使用的位图,即System.Drawing.Bitmap,在您使用的代码中将其复制到System.Drawing.Image

这些类型的位图对WPF没有用,所以你不能转换Clipboard类的WPF版本给你一个对WinForms有用的类型的事实是预期的,而不是你的问题

您的问题是,对于WPF,您需要一种可以与WPF一起使用的位图:BitmapSource。这可以用于像Image这样的WPF控件。那么,回到你的问题:

  • 如果您使用的是WPF4,则可以使用Clipboard.GetImage返回BitmapSource,正是您需要的
  • 如果你正在使用其他任何东西,你可以使用Thomas Levesque描述的技术here

总结:

  • 对于WinForms:WinForms clipboard => WinForms位图
  • 对于WPF:WPF剪贴板=> WPF位图