[英]How to save dynamic image from WebBrowser control
我正在寻找某种方法来保存从WebBrowser控件动态生成的图像。 场景是我需要登录到一个网站,然后有一个包含用户数据和服务器在运行时提供的图像的表单。 我需要在抓取数据后对其进行处理。 这意味着我可以在WebBrowser控件中看到该图像,但是由于没有URL,所以无法保存它。 由于登录的原因,WebClient似乎不是开箱即用的选项。 如果选择webclient替换WebBrowser控件,我将必须实现状态完全通信。
唯一的障碍是动态图像,在集思广益之后,我无法在此方面取得任何进展。 不管我选择哪种方式,我都以死胡同告终。 我可以看到WebBrowser控件正在显示该图像,因此它必须已将其下载到某个地方。 但是由于某种原因,我无法弄清楚它在哪里保存该图像以及如何捕获它。 我什至在想做一个无声的完整页面保存,但是有Windows提示消息。
我真的很感谢关于此的一些建议。
这是前一阵子,这里是链接
您可以通过调用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.