如何使用C#和WebKit.NET捕获完整的网站截图?

12

我正在使用WebKit.NET将一个浏览器组件集成到我的C#应用程序中。问题是我只能通过截图来捕获浏览器窗口中的可见部分。有没有办法捕获整个页面的屏幕截图?


1
@EmanueleGreco 不好意思,我现在还没有,但是明天我会尝试提取一个最小版本来进行演示。 - topless
我认为我会选择Awesomium解决方案,因为它提供了中间层来注入JavaScript代码,这对我的未来计划非常方便。 - topless
3个回答

12

7
我会使用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;
}

我已经发现了使用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;

    }

请您把代码缩进一下好吗?('编辑',全选,Ctrl-k)。谢谢。 - byako
2
这个程序完美运行,但有一个缺陷.. 你需要知道尺寸来设置浏览器控件,因为它只会打印其中的内容。我猜现在需要搜索一下如何确定网页的宽度和高度了。 - user1853517
1
在DocumentCompleted()中创建浏览器对象后,添加以下内容:int height = browser.Document.Body.ScrollRectangle.Height; int width = browser.Document.Body.ScrollRectangle.Width;browser.Height = height; browser.Width = width; - user1853517

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接