IE网页截图技术笔记

网页截图技术似乎并不是很复杂,网上有很多实例,但是真的想搞清楚的话,还是有很多细节需要注意的。下面是我个人一些经验总结。

  • 有3个技术方案,可以实现IE截图
           这篇博客(http://blog.youkuaiyun.com/wingeek/article/details/6067096)说的很详细了,我实现了第2,3种方案,第1个方案缺点太明显了就没做了。
           我的实现部分代码如下:        
            方案2:
             Rectangle body = webBrowser1.Document.Body.ScrollRectangle;
            body.Height = height;
            body.Width = width;
            <span style="font-family: Arial, Helvetica, sans-serif;">IntPtr hmemdc = CreateCompatibleDC(hscrdc);</span>
            SelectObject(hmemdc, hbitmap);
            IViewObject ivo = webBrowser1.Document.DomDocument as IViewObject;
            ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero,
                 hscrdc, hmemdc, ref body,
                 ref body, IntPtr.Zero, 0);

            这个方案的优点是可以实现缩放,但是效果很不好,截图比较有点模糊;放大会崩溃,这个问题似乎并没有好解决方案;有些第三方ActiveX没有实现IViewObject接口,就不能显示在截图里面,如银行密码输入控件等。
          方案3:
     public static Bitmap GetWindow(IntPtr hWnd,int width,int height)
        {
            IntPtr hscrdc = GetWindowDC(hWnd);
            IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, width, height);
            IntPtr hmemdc = CreateCompatibleDC(hscrdc);
            SelectObject(hmemdc, hbitmap);
            bool re= PrintWindow(hWnd, hmemdc, 0);
            Bitmap bmp = null;
            if(re)
            {
                bmp = Bitmap.FromHbitmap(hbitmap);                  
            }
            DeleteObject(hbitmap);
            DeleteDC(hmemdc);     
            ReleaseDC(hWnd, hscrdc);
            return bmp;
        }
             这个方案的唯一缺点是不能对特定元素截图,虽然不能直接缩放,但是对得到截图后再进行缩放也是很容易的。
  • 不管哪种技术方案,都只能对网页可见区域进行截图,不是完整的网页
             为此我调研了很久,也使用了360浏览器的网页截图,也是只能截取可见部分。
             这个理论上是可以理解的,IE为了性能考虑,只渲染了可见区域的网页,当用户滚动滚动条的时候才会向下渲染。但是有两个间接完整网页的实现方法:1)将浏览器设大足够大,一次性显示所有完整网页。2)滚动滚动条多次截图,再拼接。
  • 使用PrintWindow是最稳定,有效的方法
            综合考虑我选择了第三种方案,下面就详细谈谈PrintWindow:
             参数详见 MSDN,主要就是将窗口绘制成位图,这里我遇到了一个问题:就是当窗口弹出了一个子对话框的时候,是没办法截取到的。可以使用GetWindow(GetParent(vHandle), 6) 取到弹窗的句柄,然后分别截图。

以上就是我的一些经验总结了,如有问题欢迎指正!
             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值