我正在寻找一些方法来保存来自WebBrowser控件的动态生成的图像。场景是我需要登录到一个网站然后有一个包含用户数据的表单加上一个服务器在运行时提供的图像。我需要在抓取数据后处理这些数据。这意味着我可以在WebBrowser控件中看到该图像,但我无法保存它,因为它没有任何URL。由于登录的缘故,WebClient似乎不是一个开箱即用的选项。如果我选择webclient来替换WebBrowser控件,我将不得不实现状态完全通信?
唯一的障碍是动态图像和头脑风暴之后我无法取得任何进展。无论我选择何种方式,我都走到了尽头。我可以看到WebBrowser控件正在显示该图像,因此它必须已将其下载到某处。但由于某种原因,我无法弄清楚它保留图像的位置以及如何抓住它。我甚至想知道做一个无声的完整页面保存但是那时有Windows提示信息。
我真的很感激有关此的一些建议。
答案 0 :(得分:6)
这是前一段时间,这是链接
答案 1 :(得分:2)
您可以通过调用其Bitmap
方法将WebBrowser的整个可见内容呈现为DrawToBitmap
(该方法在那里并将进行编译 - 您将无法在Intellisense中看到它)。假设每次服务器提供的图像都在同一个地方,您可以将图像从整个位图中剪切出来。
答案 2 :(得分:-1)
我找到了一个不需要复制到剪贴板的解决方案(来自论坛某处的原创想法,我找不到链接给原始海报的功劳)
[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);