这两天,因为我手头的一个网站目录程序是PHP开发的,但是收录网站的时候,无法获取截图,于是想自己把此功能补全!
但是经过一番折腾后发现:以自己目前连入门都算不上的PHP水平,根本无法解决此问题,于是最终转到了自己最擅长的.NET上面来!决定自己独立在PHP之外,写一个WINFORM或者服务定时扫描MYSQL数据库,对所有没有截图的地址,把截图补上,然后更新MYSQL数据库!
在.NET中,我们可以借助WebBrowser控件进行网址请求,请求完成后,调用DrawToBitmap方法即可将结果绘制成图片!
直接上代码:
WebBrowse webBrowser = new WebBrowser();//创建WebBrowser实例 webBrowser.Height = 768;//设置控件高为768 webBrowser.Width = 1024;//设置控件宽为1024 webBrowser.ScrollBarsEnabled = false; // 隐藏滚动条 webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(documentCompleted); // 增加网页加载完成事件处理函数 webBrowser.Navigate("http://www.jiniannet.com"); // 打开网页
在这里讲解下,为什么要将控件的宽高设为1024*768呢,因为我的目地不是截取目标网站的完整截图,只是为了取到一个缩略图,所以使用了1024*768像素的宽高,模拟用户实际使用环境(目前1024是一般网站前端设计参考比较多的一个宽度标准,设置高为768,是因为我最终要保存的缩略图是4:3,用768,正好不需要进行换算!比较方便!)
请求完成后,就会调用documentCompleted进行截图,我们来看看documentCompleted的代码:
private void documentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { WebBrowser webBrowser = (WebBrowser)sender; // 网页加载完毕才保存 if (webBrowser.ReadyState == WebBrowserReadyState.Complete) { int heigt = webBrowser.Heigh; int width = webBrowser.Width; /* // 获取网页高度和宽度,如果需要获取整个网站的完整截图,把这段代码取消注释即可。 int height = webBrowser.Document.Body.ScrollRectangle.Height; int width = webBrowser.Document.Body.ScrollRectangle.Width; webBrowser.Height = height; webBrowser.Width = width; */ using (Bitmap bitmap = new Bitmap(width , heigt)) { Rectangle rectangle = new Rectangle(0, 0, width ,heigt); // 绘图区域 webBrowser.DrawToBitmap(bitmap, rectangle); // 截图 bitmap.Save("c:\\" + webBrowser.Url.Host + ".jpg", ImageFormat.Jpeg); // 保存大图,如果不需要保存大图,注释此行,反之,取消注释即可 //保存缩略图,我只需要保存一个120*100的缩略图即可 bitmap.GetThumbnailImage(120,100, null, IntPtr.Zero).Save"c:\\t_" + webBrowser.Url.Host + ".jpg", ImageFormat.Jpeg); } } }
至此功能完成,不过在这里我要提醒大家,此代码有风险,因为WebBrowser会对目标网址进行一次实际访问操作,假如目标网址存在恶意代码,就有可能导致服务器中毒!因为WebBrowser调用的是IE内核,在进行截图前,我们可以将服务器上的IE进行一些安全设置,比如禁此JS等。或者直接将程序在本地运行,截图生成功后,再批量传至服务器!
原创文章,转载请注明出处!本站所有转载文章都会注明出处,毕竟作者写作不容易,大家都互相支持下。另,极念网站目录,目前无条件免费收录新网站,只要你已经被百度收录了即可,有兴趣的可以去提交一下!