wpf InteropBitmap到位图

我有一个奇怪的问题。 我正在尝试检索已经加载到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’。”

我该如何解决这个问题?

请任何人都可以提供任何指导。

先感谢您。

您遇到的问题是有两个不同的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 在这里描述的技术

综上所述:

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