2013-01-05 83 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是不可靠的。無論如何,感謝您簡化我的代碼。 –