繁体   English   中英

如何从WebBrowser控件保存动态图像

[英]How to save dynamic image from WebBrowser control

我正在寻找某种方法来保存从WebBrowser控件动态生成的图像。 场景是我需要登录到一个网站,然后有一个包含用户数据和服务器在运行时提供的图像的表单。 我需要在抓取数据后对其进行处理。 这意味着我可以在WebBrowser控件中看到该图像,但是由于没有URL,所以无法保存它。 由于登录的原因,WebClient似乎不是开箱即用的选项。 如果选择webclient替换WebBrowser控件,我将必须实现状态完全通信。

唯一的障碍是动态图像,在集思广益之后,我无法在此方面取得任何进展。 不管我选择哪种方式,我都以死胡同告终。 我可以看到WebBrowser控件正在显示该图像,因此它必须已将其下载到某个地方。 但是由于某种原因,我无法弄清楚它在哪里保存该图像以及如何捕获它。 我什至在想做一个无声的完整页面保存,但是有Windows提示消息。

我真的很感谢关于此的一些建议。

这是前一阵子,这里是链接

WebBrowser将图像复制到剪贴板

您可以通过调用WebBrowser的DrawToBitmap方法将WebBrowser的所有可见内容呈现为一个Bitmap (该方法已存在并且将进行编译-您在Intellisense中不会看到它)。 假设每次服务器提供的图像都在同一位置,则可以从完整的位图中仅裁剪图像。

我找到了不需要复制到剪贴板的解决方案(来自论坛某个地方的原始想法,我找不到指向原始海报的功劳链接)

[Guid("3050f669-98b5-11cf-bb82-00aa00bdce0b"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown),ComVisible(true),ComImport]
interface IHTMLElementRender
{
  void DrawToDC([In] IntPtr hDC);
  void SetDocumentPrinter([In, MarshalAs(UnmanagedType.BStr)] string
  bstrPrinterName, [In] IntPtr hDC);
}

public MemoryStream CopyImage(WebBrowser webBrowser, IHTMLElement3 el, int width, int height)
{
  MemoryStream stream = new MemoryStream();
  WebBrowser wb = webBrowser;
  IHTMLDocument3 doc = (IHTMLDocument3)wb.Document.DomDocument;
  if (doc != null)
  {
    if (el != null)
    {
     IHTMLElementRender Render = (IHTMLElementRender)el;
     Bitmap bm = new Bitmap(width, height);
     Graphics g = Graphics.FromImage(bm); 
     IntPtr hdc = g.GetHdc();
     Render.DrawToDC(hdc);
     g.ReleaseHdc(hdc);
     g.Dispose();
     Marshal.ReleaseComObject(Render);
     bm.Save(stream, ImageFormat.Bmp);
    }
  }
 return stream;
}

用法示例:

IHTMLDocument3 docy =(IHTMLDocument3)webBrowser.Document.DomDocument;
var div = docy.getElementById("image");
IHTMLElement3 img = div.children[0];
stream = browsersForm.CopyImage(webBrowser, img, 200, 100);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM