2013-01-05 42 views
5

有很多关于这方面的线索,但没有一个是清楚的,没有任何我尝试过,甚至工作正确。获取网页浏览器控件的截图?

获取整个网页浏览器控件内容的代码是什么(甚至是屏幕外的内容)?

看起来他们确实有:

webBrowser1.DrawToBitmap(); // but its unsupported and doesnt work 
  1. 3rd party api - not wasting my time
  2. .DrawToBitmap and nonanswer-links
  3. 100 wrong answers
  4. just takes a screenshot
+3

如果你的意思是SO线程,如何链接到他们,并指定为什么他们每个人没有工作 –

+0

有你马特。顺便说一句,你知道答案吗? – user1873073

+0

@ user1873073请张贴您的部分代码。特别是在您正在加载文档和文档完成事件的情况下。 – scartag

回答

3

上周我正在研究项目中的类似功能,请阅读关于此主题的一些帖子,包括您的链接。我想分享我的经验:

该函数的关键部分是System.Windows.Forms.WebBrowser.DrawToBitmap方法。

,但其不支持和不工作

它是支持和工作,但并不总是工作正常。在某些情况下,你会得到一个空白的图像截图(根据我的经验,它加载的HTML越复杂,它越有可能失败。在我的项目中,只有非常简单和格式良好的htmls将被加载到WebBrowser控件,所以我从来没有空白图像)。

无论如何,我还没有100%完美的解决方案。这里是我的核心代码的一部分,并希望它有帮助(它在ASP.NET MVC 3上工作)。

using (var browser = new System.Windows.Forms.WebBrowser()) 
{ 
    browser.DocumentCompleted += delegate 
    { 
     using (var pic = new Bitmap(browser.Width, browser.Height)) 
     { 
      browser.DrawToBitmap(pic, new Rectangle(0, 0, pic.Width, pic.Height)); 
      pic.Save(imagePath); 
     } 
    }; 

    browser.Navigate(Server.MapPath("~") + htmlPath); //a file or a url 
    browser.ScrollBarsEnabled = false; 

    while (browser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) 
    { 
     System.Windows.Forms.Application.DoEvents(); 
    } 
} 
+2

您是否有任何解决您遇到的问题“空白图像问题”。因为我刚刚面对过它。谢谢 – Vivekh

+0

我有svg图像作为背景和它的顶部的html和从json的数据映射到web浏览器控制内的dom。我也得到空白图片 – Sandeep

+0

@Sandeep正如我在答案中所说的,如果您的html页面非常复杂,我不知道如何解决空白页问题。 –

6

尽力确保您呼叫的方法在DocumentCompleted事件中。

webBrowser1.Width = wb.Document.Body.ScrollRectangle.Width; 
webBrowser1.Height = wb.Document.Body.ScrollRectangle.Height; 

Bitmap bitmap = new Bitmap(webBrowser1.Width, webBrowser1.Height); 
webBrowser1.DrawToBitmap(bitmap, new Rectangle(0, 0, webBrowser1.Width, webBrowser1.Height)); 
+0

这可能是它,但我的目标是能够做一个谷歌图片搜索和点击显示更多,直到它到达底部,然后单击一个按钮,因此documentcompleted将无法正常工作。 – user1873073

+0

@ user1873073不确定为什么你认为它不起作用。完成的文档将被多次调用(每个新请求一个),重要的是它在最后一次调用时的作用。 – scartag

+0

我知道,我最初写了这个巨大的实现,它直接从打开的控件的窗口中拍摄一张照片,然后滚动控件,并将图像拼接在一起。然后,我尽可能多地修复了滚动相关的问题...... 但是就在我现在随机找到你的帖子,并且睁大眼睛:你可以将宽度设置得比屏幕上显示的宽度大得多,没有任何问题?!你的两条小线代替了我的程序中的一些200-300。唯一的区别是我现在使用了一个activeX capturer,因为DrawToBitmap是不可靠的。无论如何,感谢您简化我的代码。 –