2012-10-24 56 views
11

我正在使用WebKit.NET將瀏覽器組件集成到我的C#應用​​程序中。問題是我只能用截圖捕獲瀏覽器窗口中的可見部分。有沒有辦法捕捉整個頁面的截圖?如何捕捉C#和WebKit.NET的完整網站截圖?

+0

您可以發佈您的代碼? –

+1

@EmanueleGreco不幸的是,如果我可以爲演示目的提取它的最小版本,我將在明天看看。 – topless

+0

我想我會用awesomium解決方案,因爲它提供了用於注入JavaScript代碼的中間層,這對我未來的計劃來說非常方便。 – topless

回答

6

我使用WebBrowser來代替; ScrollBarsEnabled = false讓我捕捉整個頁面。

下面是一些代碼:

protected override void Render(HtmlTextWriter writer) 
{ 

     StringBuilder builder = new StringBuilder(); 
     HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(builder)); 
     base.Render(htw); 
     string html = builder.ToString(); 

     _Generate(html); 
} 


private void _Generate(string html) 
{ 
    var browser = new WebBrowser { ScrollBarsEnabled = false }; 
    DisplayHtml(html, browser); 
    browser.DocumentCompleted += WebBrowser_DocumentCompleted; 
    while (browser.ReadyState != WebBrowserReadyState.Complete) 
     Application.DoEvents(); 
    browser.Dispose(); 
} 

private void DisplayHtml(string html, WebBrowser browser) 
{ 
    browser.Navigate("about:blank"); 
    if (browser.Document != null) 
    { 
     browser.Document.Write(string.Empty); 
    } 
    browser.DocumentText = html; 
} 
+0

我偶然發現了幾個使用WebBrowser組件的解決方案,但我有興趣使用WebKit引擎來捕獲它。 – topless

4

試試這個:

using System.IO; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Threading; 
using System.Windows.Forms; 

    public byte[] picbytes; 

    private void capture_Click(object sender, EventArgs e) 
    { 

     makepicture(txtURL.Text.Trim()); 
     pictureBox1.Visible = true; 
     pictureBox1.Image = ByteToImage(picbytes); 
    } 

    private void makepicture(string url) 
    { 
     Thread thread = new Thread(delegate() 
     { 
      using (WebBrowser browser = new WebBrowser()) 
      { 
       browser.ScrollBarsEnabled = false; 
       browser.AllowNavigation = true; 
       browser.Navigate(url); 
       browser.Width = 1024; 
       browser.Height = 1575; 
       browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted); 
       while (browser.ReadyState != WebBrowserReadyState.Complete) 
       { 
        System.Windows.Forms.Application.DoEvents(); 
       } 

      } 
     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
     thread.Join(); 
    } 

    private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser browser = sender as WebBrowser; 
     using (Bitmap bitmap = new Bitmap(browser.Width, browser.Height)) 
     { 
      browser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, browser.Width, browser.Height)); 
      using (MemoryStream stream = new MemoryStream()) 
      { 
       bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
       byte[] bytes = stream.ToArray(); 
       picbytes = bytes; 

      } 
     } 
    } 

    public static Bitmap ByteToImage(byte[] blob) 
    { 
     MemoryStream mStream = new MemoryStream(); 
     byte[] pData = blob; 
     mStream.Write(pData, 0, Convert.ToInt32(pData.Length)); 
     Bitmap bm = new Bitmap(mStream, false); 
     mStream.Dispose(); 
     return bm; 

    } 
+0

你能否縮進你的代碼? ('編輯',選擇所有內容,Ctrl-k)。謝謝。 – byako

+0

這完美地工作,只有一個缺陷..你真的需要知道尺寸來設置瀏覽器控件,因爲它只會打印內容。我想現在是一個搜索找到,如何分辨網頁有多寬和多高。在DocumentCompleted()中的 – Switch

+0

在創建瀏覽器對象之後添加以下內容。 int height = browser.Document.Body.ScrollRectangle.Height; int width = browser.Document.Body.ScrollRectangle.Width; browser.Height = height; browser.Width = width; – Switch