我正在使用WebKit.NET將瀏覽器組件集成到我的C#應用程序中。問題是我只能用截圖捕獲瀏覽器窗口中的可見部分。有沒有辦法捕捉整個頁面的截圖?如何捕捉C#和WebKit.NET的完整網站截圖?
回答
看起來這是有可能通過使用NativeMethods.SendMessage,雖然這可能搞砸了消息隊列,你可以使用http://cutycapt.sourceforge.net/或http://iecapt.sourceforge.net/或http://labs.awesomium.com/capturing-web-pages-with-c-net/?
我使用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
試試這個:
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
這完美地工作,只有一個缺陷..你真的需要知道尺寸來設置瀏覽器控件,因爲它只會打印內容。我想現在是一個搜索找到,如何分辨網頁有多寬和多高。在DocumentCompleted()中的 – Switch
在創建瀏覽器對象之後添加以下內容。 int height = browser.Document.Body.ScrollRectangle.Height; int width = browser.Document.Body.ScrollRectangle.Width; browser.Height = height; browser.Width = width; – Switch
- 1. 如何捕捉高分辨率的網站截圖?
- 2. 如何捕捉網站地圖構造
- 3. CasperJS - 無法捕捉到完整的網站screenshoot withPopup功能
- 4. 如何使用Selenium在Chrome中捕捉完整的屏幕截圖?
- 5. 硒網格,捕捉屏幕截圖
- 6. 如何在無人蔘與模式下捕捉網站的屏幕截圖?
- 7. 捕捉截圖戒菸
- 8. Unity3D黑屏捕捉截圖
- 9. 如何使用Selenium和java獲取完整網頁的截圖?
- 10. 如何截取網站的截圖
- 11. 如何從.Net世界的網站捕捉攝像頭圖像?
- 12. 捕捉屏幕截圖圖片'Android'
- 13. 主要網站如何從鏈接捕捉縮略圖?
- 14. 網站抓取和截圖
- 15. 如何捕捉表面視圖的屏幕截圖
- 16. 如何捕捉地圖平移和縮放真的完成?
- 17. 捕捉SIGBUS和C++
- 18. 在工作站被鎖定時捕捉屏幕截圖
- 19. 如何捕捉父網頁
- 20. 在多個瀏覽器中捕捉完整的網頁截圖(帶有插件/插件)?
- 21. 如何捕捉包含cocs2d和UIKit的視圖的屏幕截圖
- 22. C中的圖像捕捉#
- 23. 使用畫布捕捉視頻截圖
- 24. 在iPhone中捕捉屏幕截圖?
- 25. 捕捉圖像截斷事件
- 26. 截圖捕捉速度非常緩慢
- 27. 如何捕捉網站上的圖像,並在其他網頁上顯示
- 28. 如何下載完整的網站?
- 29. 如何在背景中捕捉surfaceview的截圖
- 30. 如何捕捉摩托羅拉Xoom(android)的截圖?
您可以發佈您的代碼? –
@EmanueleGreco不幸的是,如果我可以爲演示目的提取它的最小版本,我將在明天看看。 – topless
我想我會用awesomium解決方案,因爲它提供了用於注入JavaScript代碼的中間層,這對我未來的計劃來說非常方便。 – topless