【问题标题】:How to capture a full website screenshot with C# and WebKit.NET?如何使用 C# 和 WebKit.NET 捕获完整的网站截图?
【发布时间】:2012-10-24 11:22:44
【问题描述】:

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

【问题讨论】:

  • @EmanueleGreco 不,遗憾的是没有,但如果我能提取它的最小版本用于演示目的,我明天会看看。
  • 我想我会选择 awesomium 解决方案,因为它还提供了用于注入 JavaScript 代码的中间层,这对我未来的计划非常方便。

标签: c# .net webkit screenshot


【解决方案1】:

似乎可以通过使用 NativeMethods.SendMessage,虽然这会搞砸消息队列,但您可以使用http://cutycapt.sourceforge.net/http://iecapt.sourceforge.net/http://labs.awesomium.com/capturing-web-pages-with-c-net/ 吗?

【讨论】:

    【解决方案2】:

    我改用 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 引擎来捕获它。
    【解决方案3】:

    试试这个:

    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)。谢谢。
    • 这工作完美,有一个缺陷。你真的需要知道尺寸来设置浏览器控件,因为它只会打印里面的内容。我想现在是一个搜索,如何判断网页的宽度和高度。
    • 在 DocumentCompleted() 中添加以下内容,就在创建浏览器对象之后。 int height = browser.Document.Body.ScrollRectangle.Height; int 宽度 = browser.Document.Body.ScrollRectangle.Width; browser.Height = 高度; browser.Width = 宽度;
    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 2011-05-26
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多