在上一篇随笔中,大家给出了不少建议,尤其是指出了截屏方法的不足之处。其实,使用上述方法去截屏也是逼不得已,因为公司实际项目需求中,还有其他一些要求,在此不便细说。如果仅仅为了截屏,我推荐大家直接用WebBrowser控件来实现,非常简单。
实现步骤如下:
(1)新建一个Form应用程序,在窗体上添加一个Panel,假设Name为panel1,设置:panel1.AutoScroll=true。
(2)在panel1中放置一个WebBrowser控件,假设Name为webBrowser1,设置:webBrowser1.ScriptErrorsSuppressed = true;(禁止弹出脚本错误框)
(3)注册webBrowser1.DocumentCompleted事件,当页面加载完毕后,将webBrowser1的大小设置为和页面一样大。这是最关键的地方,否则就只能截取可见部分了。
(4)最后,调用webBrowser1.DrawToBitmap方法,将页面画到Bitmap上,然后保存为图片文件。
C#源代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WebBrowserTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate(textBox1.Text); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.Equals(textBox1.Text)) {//这里比较麻烦,有些网站并不满足这个条件:webBrowser1.ReadyState == WebBrowserReadyState.Complete //将WebBrowser控件设置为和页面一样大(这步很关键,否则只能截取到可见部分) Size rc = webBrowser1.Document.Body.ScrollRectangle.Size; webBrowser1.Width = rc.Width + SystemInformation.VerticalScrollBarWidth; webBrowser1.Height = rc.Height + SystemInformation.HorizontalScrollBarHeight; //将页面画到一个画布上,然后另存为图片 using (Bitmap bitmap = new Bitmap(webBrowser1.Width, webBrowser1.Height)) { webBrowser1.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height)); bitmap.Save(@"d:\capture.png"); } MessageBox.Show("OK"); } } } }
【总结】
使用WebBrowser控件也有不足之处,比方说:
1、DocumentCompleted状态判断不稳定;
2、弹出窗口不好过滤。
3、必须依赖Form窗口。
此外,WebBrowser控件是基于IE内核的,也有的朋友采用的是基于WebKit内核的浏览器组件,用起来也挺方便的。欢迎大家继续指正。
最后给出sina.com.cn的首页截图,看看效果(图片太大,压缩了一下,所以有点模糊):