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

  • 有3个技术方案,可以实现IE截图
这篇博客(http://blog.csdn.net/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) 取到弹窗的句柄,然后分别截图。
以上就是我的一些经验总结了,如有问题欢迎指正!

IE网页截图技术笔记相关推荐

  1. java web 截图_如何以Java实现网页截图技术

    今天看到某网友关于"如何以Java实现网页截图技术"的咨询帖,由于出现该咨询的地点非常不适合较长回复,故以博文形式回答. 事实上,如果您想以Java实现网页截图,也就是" ...

  2. 如何以Java实现网页截图技术

    今天看到某网友关于"如何以Java实现网页截图技术"的咨询帖,由于出现该咨询的地点非常不适合较长回复,故以博文形式回答. 事实上,如果您想以Java实现网页截图,也就是" ...

  3. [IE编程] IE网页截图技术总结

    IE网页截图是IE编程中的经典问题. IE9 beta发布之后我收到很多关于这方面的问题. 最近我把IE和Windows中这部分相关的代码重新架构了一下,使它们能够在IE9开启硬件加速的情况下完美兼容 ...

  4. java webengine_如何以Java实现网页截图技术

    展开全部 使用JavaFX8(JDK8打包在一起) public void start(Stage primaryStage) throws Exception { final WebView vie ...

  5. 如何以Java实现网页截图技术,根据URL得到网页快照

    // 此方法仅适用于JdK1.6及以上版本 Desktop.getDesktop().browse( new URL("http://www.csdn.net/").toURI() ...

  6. 使用PhantomJS实现网页截图服务

    使用PhantomJS实现网页截图服务 2015-12-12来源:Java教程人气:99 这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片.研究了不少工具,效果都不理想,不是显示太差了(Ca ...

  7. php面试题9(看的时候就应该随手截图做笔记的)

    php面试题9(看的时候就应该随手截图做笔记的) 一.总结 看的时候就应该随手截图做笔记的 二.php面试题9 一.选择题: 1.下面哪个表达式不能将两个字符串$s1 和$s2 串联成一个单独的字符串 ...

  8. html2canvas 一个强大的使用js开发的浏览器网页截图工具

    html2canvas是一个JavaScript类库,它使用了html5和css3的一些新功能特性,实现了在客户端对网页进行截图的功 能.html2canvas通过获取页面的DOM和元素的样式信息,并 ...

  9. [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题

    因为IE9直接使用硬件图形接口D2D/DWrite进行网页渲染,所以使用基于GDI的函数访问IE9的时候会出现问题. 目前国内的浏览器(如:傲游,搜狗)都是使用GDI函数来实现网页截图的, 当IE内核 ...

最新文章

  1. 笔记本建立wifi热点!(主要针对XP)【直播】
  2. 简单实现promise封装
  3. 使用Domain-Protect保护你的网站抵御子域名接管攻击
  4. scrapy-redis mysql_scrapy-redis 构建分布式爬虫,此片文章有问题。不要用
  5. OpenGL顶点阵列对象
  6. Android 自定义注解(Annotation)
  7. oracle的iw算法,[转载]Oracle日期周详解IW
  8. 鉴定5分钟,准确率95.64% | 微生物所付钰组实现了微生物单细胞水平的快速准确鉴定...
  9. 网页修改iPhone13在线源码 – 无需SVIP
  10. 任何字符串都可以作为c语言的标识符,2013年软考程序员模拟试题及答案解析一...
  11. 手写公式识别 :基于深度学习的端到端方法
  12. html标签企业级命名规范
  13. 27.将 VMware 服务器上的虚拟机备份到 Azure(上)
  14. Gartner2017年BI研究计划曝光,来看看他研究的都是啥?
  15. php常用编码,简介常见的编码方式
  16. python离线语音识别_python语音识别模块
  17. 解决0x00000FD:Stack overflow(参数:0x00000000,0x002F2000)栈溢出问题
  18. 电脑版桌面云便签账号怎么绑定微信或解绑微信?
  19. 平凡的女人,伟大的奉献
  20. 剑与家园服务器维护,剑与家园合服爆料 合服规则介绍

热门文章

  1. HTML.初学.更新
  2. 微软远程桌面升级到RDP8的方法
  3. 良心安利体育运动ppt幻灯片素材网站
  4. leetcode 179.最大数
  5. Linux 4.19.111 供电(power supply )子系统
  6. 墙面有几种装修方法_墙面装修有几种方式
  7. 传说中可“免费白拿”的无线路由器 - 斐讯 K2 最简单刷 breed 与第三方固件教程
  8. Flutter中的依赖注入——get_it
  9. P2135 方块消除
  10. 【UE5】多用户协同编辑