2012-10-24 48 views
11

Tôi đang sử dụng WebKit.NET để tích hợp thành phần trình duyệt trong ứng dụng C# của tôi. Vấn đề là tôi chỉ có thể chụp được phần hiển thị trong cửa sổ trình duyệt với một ảnh chụp màn hình. Có cách nào để chụp ảnh màn hình của toàn bộ trang không?Làm thế nào để chụp một ảnh chụp màn hình trang web đầy đủ với C# và WebKit.NET?

+0

Bạn có thể gửi mã của bạn? –

+1

@EmanueleGreco Không may là không, nhưng tôi sẽ có một cái nhìn vào ngày mai nếu tôi có thể trích xuất một phiên bản tối thiểu của nó cho mục đích trình diễn. – topless

+0

Tôi nghĩ rằng tôi sẽ đi với giải pháp awesomium vì nó cung cấp lớp trung gian cho việc tiêm mã JavaScript, điều này thực sự thuận tiện cho các kế hoạch tương lai của tôi. – topless

Trả lời

6

Tôi sử dụng Trình duyệt Web thay thế; ScrollBarsEnabled = false cho phép tôi chụp toàn bộ trang.

Dưới đây là một số mã:

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

Tôi đã vấp phải một số giải pháp bằng cách sử dụng thành phần WebBrowser, nhưng tôi quan tâm đến việc sử dụng công cụ WebKit để chụp nó. – topless

4

Hãy thử này:

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

Bạn có thể vui lòng thụt lề mã của mình không? ('Chỉnh sửa', chọn mọi thứ, Ctrl-k). Cảm ơn. – byako

+0

Điều này hoạt động hoàn hảo, với một lỗ hổng .. Bạn thực sự cần phải biết kích thước để thiết lập điều khiển trình duyệt, bởi vì nó sẽ chỉ in những gì bên trong. Tôi đoán nó bây giờ là một tìm kiếm để tìm, làm thế nào để nói rộng và cao như thế nào một trang web. – Switch

+0

trong DocumentCompleted() thêm sau đây, ngay sau khi tạo đối tượng trình duyệt. int height = browser.Document.Body.ScrollRectangle.Height; int width = browser.Document.Body.ScrollRectangle.Width; trình duyệt.Height = height; browser.Width = width; – Switch

Các vấn đề liên quan