WPF InteropBitmap到位图

Mil*_*nki 3 .net c# browser wpf winforms

我有一个奇怪的问题。我正在尝试检索已在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);
                }
            }
Run Code Online (Sandbox Code Playgroud)

但是如果我在WPF应用程序中使用相同的代码,则会在

using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().......
Run Code Online (Sandbox Code Playgroud)

错误如下:

“无法将类型为'System.Windows.Interop.InteropBitmap'的对象转换为类型为'System.Drawing.Bitmap'。”

我该如何解决?

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

先感谢您。

Ric*_*key 5

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

这些类型的位图在WPF中不起作用,因此,不能将Clipboard类的WPF版本转换为WinForms有用的类型这一事实是预料之中的,但这并不是您的问题。

您的问题是,对于WPF,您需要一种可以与WPF一起使用的位图类型:a BitmapSource。您可以将WPF控件与一起使用Image。所以,回到您的问题:

  • 如果您使用的是WPF4,则可以使用Clipboard.GetImage它返回一个BitmapSource,正是您所需要的
  • 如果您正在使用其他任何方法,则可以使用此处描述的Thomas Levesque的技术

综上所述:

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