2012-10-24 3 views
11

WebKit.NETを使用して、C#アプリケーションにブラウザコンポーネントを統合しています。問題は、スクリーンショットでブラウザウィンドウに表示される部分のみをキャプチャできることです。ページ全体のスクリーンショットをキャプチャする方法はありますか?C#とWebKit.NETで完全なWebサイトのスクリーンショットをキャプチャするには?

+0

あなたのコードを投稿することができますか? –

+1

@EmanueleGreco残念ながら、デモのために最小限のバージョンを抽出できるのであれば、明日は見ていきます。 – topless

+0

JavaScriptコードを挿入するための中間層を提供しているので、私はawesomiumの解決策に行くと思います。これは、私の将来の計画にとって本当に便利です。 – 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

コードをインデントしてください。 ( 'Edit'、すべてを選択、Ctrl-k)。ありがとう。 – byako

+0

これは完全に1つの脆弱性で動作します。ブラウザのコントロールを設定するためには、寸法を知る必要があります。私はそれが今、どのように幅広く、どれくらいの高さのWebページがあるかを見つける方法を見つける検索だと思います。 – Switch

+0

内のDocumentCompleted()は、ブラウザオブジェクトを作成した直後に以下を追加します。 int height = browser.Document.Body.ScrollRectangle.Height; int width = browser.Document.Body.ScrollRectangle.Width; browser.Height = height; browser.Width = width; – Switch

関連する問題