我遇到了一个奇怪的问题。我正在尝试检索已经加载到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'。”
我该如何解决这个问题?
任何人都可以提供任何指导。
提前谢谢。
答案 0 :(得分:5)
您遇到的问题是有两个不同的Clipboard
类,一个用于WinForms,另一个用于WPF
。 WinForms返回适合与WinForms一起使用的位图,即System.Drawing.Bitmap
,在您使用的代码中将其复制到System.Drawing.Image
。
这些类型的位图对WPF没有用,所以你不能转换Clipboard
类的WPF版本给你一个对WinForms有用的类型的事实是预期的,而不是你的问题
您的问题是,对于WPF,您需要一种可以与WPF一起使用的位图:BitmapSource
。这可以用于像Image
这样的WPF控件。那么,回到你的问题:
Clipboard.GetImage
返回BitmapSource
,正是您需要的总结: