JavaScript实现网页截图功能


Posted in Javascript onOctober 16, 2014

使用JavaScript截图,这里我要推荐两款开源组件:一个是Canvas2Image,它可以将Canvas绘图编程PNG/JPEG/BMP的图像;但是光有它还不够,我们需要给任意DOM(至少是绝大部分)截图,这就需要html2canvas,它可以将DOM对象转换成一个canvas对象。两者的功能结合起来,就可以把页面上的DOM截图成PNG或者JPEG图像了,很酷。

Canvas2Image

它的原理是利用了HTML5的canvas对象提供了toDataURL()的API:

var strDataURI = oCanvas.toDataURL();  

// returns "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACt..."

这样的结果是base64编码的(事实上,image也可以通过这种方式以字符串的形式写死到页面上),所以我们还需要一个base64编解码的lib。

但是目前的缺陷也有不少,比如目前Opera和Safari只支持PNG,FireFox的支持性则好得多。

生成图片有两种方式写入页面,一种是生成一个图片对象写入页面DOM树中,这也是支持性比较好的方式:

// returns an <img> element containing the converted PNG image  

var oImgPNG = Canvas2Image.saveAsPNG(oCanvas, true);

但是如果你做一个JavaScript截图功能的话,你可能希望截图后能够自动打开保存文件的“保存”对话框:
Canvas2Image.saveAsPNG(oCanvas);

// will prompt the user to save the image as PNG.

这个方式调用会生成一个mimeType为“image/octet-stream”的数据流到浏览器,但是“保存”对话框无法识别出图片适当的后缀名,默认保存的文件在FireFox下是“xxx.part”这种名字,这是令人遗憾的地方,但是似乎没有什么好办法解决。

html2canvas

它作用于DOM加载的过程,收集其中的信息,再来绘制canvas图像,也就是说,其实它并不是将展现的DOM树截成canvas图,而是仿照DOM树重新绘制了一张canvas图。于是很多CSS样式都无法被准确识别出来,无法准确反映到图上。

其它的限制还有不少,比如:

●javascript必须是同域的,对于跨域的情况需要使用代理服务器(API中有参数可以指定),对于image也同样;
●frame内的DOM树无法被准确绘制;
●因为要绘制的是canvas图,所以像IE8这样的浏览器需要使用FlashCanvas这样的第三方库。

这个页面可以测试各个网站使用它来截图的效果,效果相当不错:

JavaScript实现网页截图功能

API使用的例子:

html2canvas(

    [dom1, dom2],

    {

        logging: false,

        useCORS: false,

        proxy:   false,

        onrendered: function(canvas){

            // canvas 就是绘制的canvas是对象

        }

    }

);

对于这一类相对小众的类库,文档都是很差的,包括API的定义,需要阅读源码,代码上写得挺清楚的。

另外,该站点下载包里面还有一个JQuery的插件,对这个API做了一个封装,可以无视。

Javascript 相关文章推荐
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
Nov 26 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 Javascript
JavaScript中property和attribute的区别详细介绍
Mar 03 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
Sep 19 Javascript
JS脚本实现动态给标签控件添加事件的方法
Jun 02 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
微信小程序url与token设置详解
Sep 26 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
Aug 04 Javascript
详解vue2.0 资源文件assets和static的区别
Nov 27 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 Javascript
JavaScript跨域方法汇总
Oct 16 #Javascript
js阻止事件追加的具体实现
Oct 15 #Javascript
用原生js做个简单的滑动效果的回到顶部
Oct 15 #Javascript
原生的html元素选择器类似jquery选择器
Oct 15 #Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 #Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 #Javascript
javascript模拟实现ajax加载框实例
Oct 15 #Javascript
You might like
深入理解php的MySQL连接类
2013/06/07 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
浅谈php自定义错误日志
2015/02/13 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
js继承实现方法详解
2016/12/16 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python实现获取网站PR及百度权重
2015/01/21 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
python使用selenium实现批量文件下载
2019/03/11 Python
pytorch 修改预训练model实例
2020/01/18 Python
使用Python发现隐藏的wifi
2020/03/04 Python
python使用建议技巧分享(三)
2020/08/18 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
环保倡议书50字
2014/05/15 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
教师思想工作总结2015
2015/05/13 职场文书