2012-10-24 26 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