滚动网页截图 截取超长网页图像

写完的代码

程序还有很多不完善的地方

这是目前的状态 下面是对一个网站首页进行截图 截图后可以保存为指定格式

 

实现原理 使用WebBrowser控件加载需要截图的网页

调用WebBrowser的Navigate(string Url)方法加载需要截图的网页 当网页加载完毕后进行截图

此方法也有缺点 WebBrowser不具备IE的智能纠错功能 对某些CSS样式不严格的网页可能出现解析上的错误,导致网页的布局混乱 这样截图的布局也是混乱的

对于某些采用ajax技术的网站 根据其加载的方式不同 可能无法窃取到动态延迟加载的内容

对于有些网页(极少数)无法进行截图,会出现错误 具体原因目前还没有找出来,不过对于大多数网页能够完成

方法是当WebBrowser 的页面加载完毕后调整它的大小 将长度设置为网页的长度 宽度最好设置为固定宽度 如1440 1024,由于某些网页是流布局的 这些网页自适应浏览器的宽度,而某些网页Body区域的div是固定宽度的 但是固定网页宽度一般不超过1024px

下面是需要用到的webBrowser关键方法和属性

Navigate(url)

webBrowser1.Document.Body.ScrollRectangle.Height

webBrowser1.DrawToBitmap这个方法最关键 此方法是一个API函数 .NET SDK对其描述是

DrawToBitmap 基础结构。此控件不支持此方法。 (继承自 WebBrowserBase。)

此方法不适合在代码中直接使用 但是并非不能使用,很多人对滚动截图很疑惑 其实真的对.NET类库中常用的类仔细学习过就不会有这种疑惑了

我们可以调用这个方法把网页画到事先在内存中创建好的位图 画好对位图进行格式转换和保存

以下是用到的字段

private string _currentFormat = "png";
private int _currentWidth = 1024;
private string _fileName = null;
private Bitmap _currentBitmap = null;

 

在加载完成后

 

代码
 1 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
 2 {
 3     if (webBrowser1.Document == null)
 4         return;
 5     try
 6     {
 7         int width = _currentWidth;
 8         int height = webBrowser1.Document.Body.ScrollRectangle.Height;
 9         webBrowser1.Width = width;
10         webBrowser1.Height = height;
11         _currentBitmap = new Bitmap(width, height);
12         webBrowser1.Stop();
13         webBrowser1.DrawToBitmap(_currentBitmap, new Rectangle(00, width, height));
14         pictureBox1.Image = _currentBitmap;
15         button1.Enabled = true;
16     }
17     catch (Exception ex)
18     {
19         button1.Enabled = true;
20         MessageBox.Show(ex.ToString(), "遇到错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
21     }
22 }

 

 

此方法将webBrowser控件高度调整到和网页一致 再将其画到已经创建好的图片中

这样我们就获取了这个图形对象 _currentBitmap 获取后可以调用其Save方法进行相应的格式选择保存到磁盘中

posted on 2010-12-12 16:17  狐狸狡猾不  阅读(7692)  评论(3编辑  收藏  举报

导航



Powered by: 博客园 copyright © 2009-2012 狐狸狡猾不