小议IE10下的DrawToBitmap方法
在完成博文“PS网页设计教程XXIV——从头设计一个漂亮的网站”后。
出于习惯,打开之前“利用Webbrowser类实现超长网页的截屏的实现(解决报错不能截取的难题)”中的代码的程序,截取博文作为资料保存。
不料,虽然程序很完美的执行了,但是截的图确有问题
参数显示,该截图有46688高,但是在截图中却出现了三次博文的抬头。也就是说,每大约在20000的地方,又重头开始截图了。这个是之前没有出现的情况。
出了问题了?立马打开代码,看看有没有什么问题?
Dim R As Rectangle = New Rectangle(0, 0, _Web.Width, _Web.Height)
_Web.Document.Window.Parent.ScrollTo(0, _CapTop)
If _Web.Document.Body.Parent.ScrollTop = _CapTop Then
_Bmp = New Bitmap(_Web.Width, _Web.Height)
_Web.DrawToBitmap(_Bmp, R)
Else
_Web.Height = _Web.Height - (_CapTop - _Web.Document.Body.Parent.ScrollTop)
_Web.Document.Window.Parent.ScrollTo(0, _CapTop)
_Bmp = New Bitmap(_Web.Width, _Web.Height)
R.Height = _Web.Height
_Web.DrawToBitmap(_Bmp, R)
End If
关于截图的核心代码如上所示。由于在之前的博文提到,WebBrowser类的DrawToBitmap方法对于高度很高的图片支持度不太好。因此,我采用了分段截图的方法。以本文为例,网页的高度46688,分三段截图。
第一次,将网页滚动到_Web.Document.Window.Parent.ScrollTo(0, 0)。截取高20000的图
第二次,将网页滚动到_Web.Document.Window.Parent.ScrollTo(0, 20000)。截取高20000的图
第三次,将网页滚动到_Web.Document.Window.Parent.ScrollTo(0, 40000)。截取剩下的高6688的图
WebBrowser类实际上是封装了系统中的IE,而DrawToBitmap方法是将浏览器窗口中的图截到Bitmap对象
按理说,上面的代码没有啥问题。之前,截取其他的图都没啥问题。
抱着试一试的心情,打开以前的PS网页教程,再次截取一下,悲剧又出现了,截图中再次多次出现抬头,截图失败。
分析一下失败的原因。
首先,代码没有报错,说明,没有语法上的错误。
在单步调试中,发现,_Web.DrawToBitmap(_Bmp, R)被调用了三次。只是原本截图正常的代码,现在不工作了,每次截取的都是同一部分。
难道是_Web.Document.Window.Parent.ScrollTo(0, _CapTop)方法失效,在调用该方法后,立马查看_Web.Document.Body.Parent.ScrollTop的值,发现的确是改变了,说明_Web.Document.Window.Parent.ScrollTo(0, _CapTop)方法没有失效,运作正常。
那问题出在哪儿呢?原本好好的代码,现在运行咋不正常呢?
原本好好的代码,现在运行不正常。说明环境变了。环境?嗯,想起来了,之前用的是IE9,现在系统刚刚升级到IE10。会不会是IE内核的变化,导致代码运作失常呢?
果断卸掉IE10,回到IE9。再打开代码运行重新截图。现在正常了,看来是IE10的问题
来看看,可能出现的问题的地方
之前说过WebBrowser类实际上是IE的封装。你系统中是IE9,它调用IE9的方法;你系统中是IE10,它调用IE10的方法。
而两者唯一的差别可能就是这句话了
_Web.DrawToBitmap(_Bmp, R)
我的推测是
IE9及之前的版本,_Web.DrawToBitmap(_Bmp, R)方法只截取当前浏览器窗口中的图,对于超出浏览器的部分则无法截取,该方法的参数R以浏览器的左上角为基准的。
IE10的版本,可能由于内核的升级,_Web.DrawToBitmap(_Bmp, R)方法可以截取超出浏览器窗口部分,该方法的参数R以网页的左上角为基准的。故执行了三次_Web.DrawToBitmap(_Bmp, R)的方法,每次截取的都是同一部分的图(以网页的左上角为基准)
如果要使截图正常,要么修改R的参数;或者IE10提供了DrawToBitmap的重载方法,提供了可以设置截图位置的参数。由于没有找到相关的资料,故只能是推测。
有网友能提供相关的IE10的资料么?
还有一个问题,再从IE10到IE9时,发现IE9不太正常了,像QQ离线下载的功能就不能使用了。下载了一个IE9的安装包,说是比我系统中的IE9版本低,没法安装。有没有办法能修复IE9,使IE9正常运作?