小议IE10下的DrawToBitmap方法

简介: 在完成博文“PS网页设计教程XXIV——从头设计一个漂亮的网站”后。 出于习惯,打开之前“利用Webbrowser类实现超长网页的截屏的实现(解决报错不能截取的难题)”中的代码的程序,截取博文作为资料保存。

在完成博文“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正常运作?

相关文章
|
1月前
|
自然语言处理 算法 数据挖掘
长绳方法
进一步提高语言模型(LLM)的性能,通过扩展其上下文窗口至超过200万个标记,从而实现更深入的语境理解。本文将对这一成果进行深入解读,探讨其意义和潜在应用。
14 2
|
11天前
|
算法 数据安全/隐私保护
常用的有限元网格生成方法
本文介绍了三种常见的有限元网格生成方法:映射法、四(八)叉树法和Delaunay三角化法。映射法通过坐标变换将物理域映射到规则参数域,适合生成结构化和非结构化网格,但处理复杂区域时较困难。四(八)叉树法基于栅格,通过递归细分逼近边界,适用于非结构化网格,但内部和边界网格的相容剖分较复杂。Delaunay三角化法通过保证外接圆特性生成高质量网格,适用于凸区域,但在凹区域需进行边界恢复。前沿推进法则从边界开始逐步向内生成网格,边界质量好,但数据结构设计和推进规则制定有一定挑战。这些方法各有优缺点,常结合使用以优化网格剖分。
227 1
|
9月前
|
C#
C#中的方法
C#中的方法
50 0
|
10月前
|
存储 数据处理 数据库
结构化分析方法
1.概述 结构化方法是世界上第一个软件开发方法学,用来指导从需求分析、到设计开发各个阶段该怎么样做,采用什么样的方法,产出什么样的结果,从而保证整个软件开发周期可控。
84 0
|
JavaScript 前端开发
getMonth() 方法
getMonth() 方法
126 0
|
Java 开发者
|
Android开发
两个方法搞定透明状态栏
两个方法搞定透明状态栏
1442 0
|
C# 编译器 索引