cefsharp 超长网页截图
时间: 2023-07-11 10:39:33 浏览: 173
CefSharp是CEF在.NET平台下的封装,它提供了一个简单的方式来在.NET程序中嵌入Chromium浏览器。
在CefSharp中,我们可以通过调用CefBrowser的GetHost方法获取到CefBrowserHost对象,然后通过调用CefBrowserHost的GetImage方法来获取当前网页的截图。但是,对于超长网页,由于GetImage方法只能获取当前可视区域的截图,因此我们需要进行一些额外的操作才能获取整个网页的截图。
具体方法如下:
1. 获取网页高度
```
int totalHeight = (int)(browser.ExecuteScriptAsync("return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.body.clientHeight, document.documentElement.clientHeight);").Result);
```
这里我们调用JavaScript代码来获取网页的高度。
2. 分段获取截图
将整个网页分为多个部分,分别获取每个部分的截图,然后将这些截图拼接起来就可以得到整个网页的截图。
```
int partHeight = 32767; // 每个部分的高度
int yOffset = 0;
Bitmap bitmap = new Bitmap(1, 1);
Graphics graphics = Graphics.FromImage(bitmap);
while (yOffset < totalHeight) {
int height = Math.Min(partHeight, totalHeight - yOffset);
int width = (int)(browser.Width / browser.ZoomLevel);
int x = (int)(browser.HorizontalScroll.Value / browser.ZoomLevel);
int y = (int)((yOffset + browser.VerticalScroll.Value) / browser.ZoomLevel);
// 获取当前部分的截图
Bitmap partBitmap = new Bitmap(width, height, graphics);
Rectangle rect = new Rectangle(x, y, width, height);
graphics.CopyFromScreen(browser.PointToScreen(rect), new Point(0, 0), rect.Size);
partBitmap = partBitmap.Clone(new Rectangle(0, 0, partBitmap.Width, partBitmap.Height), PixelFormat.Format32bppArgb);
// 拼接截图
fullBitmap = CombineBitmaps(fullBitmap, partBitmap, yOffset);
yOffset += partHeight;
}
```
在以上代码中,我们使用了CombineBitmaps方法来将多个部分的截图拼接起来。
```
private static Bitmap CombineBitmaps(Bitmap bitmap1, Bitmap bitmap2, int yOffset) {
if (bitmap1 == null) {
return bitmap2;
}
Bitmap bitmap = new Bitmap(bitmap1.Width, yOffset + bitmap2.Height);
using (Graphics g = Graphics.FromImage(bitmap)) {
g.DrawImage(bitmap1, new Rectangle(0, 0, bitmap1.Width, bitmap1.Height));
g.DrawImage(bitmap2, new Rectangle(0, yOffset, bitmap2.Width, bitmap2.Height));
}
return bitmap;
}
```
通过以上方法,我们就可以实现获取超长网页的截图了。需要注意的是,如果网页过长,可能会出现内存不足的问题,因此我们可以根据实际情况调整每个部分的高度。
阅读全文