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位图