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 相关文章推荐
与jquery serializeArray()一起使用的函数,主要来方便提交表单
Jan 31 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
基于Css3和JQuery实现打字机效果
Aug 11 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
Jquery attr()方法 属性赋值和属性获取详解
Apr 15 Javascript
Centos7 中安装 Node.js v4.4.4
Nov 03 Javascript
BootStrap实现轮播图效果(收藏)
Dec 30 Javascript
原生JS实现ajax与ajax的跨域请求实例
Dec 01 Javascript
Vue表单demo v-model双向绑定问题
Jun 29 Javascript
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
JavaScript实现单英文金山打字通
Jul 24 Javascript
JS数组属性去重并校验重复数据
Jan 10 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根据身份证号码计算年龄的实例代码
2014/01/18 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
Python的时间模块datetime详解
2017/04/17 Python
Python整数对象实现原理详解
2019/07/01 Python
使用Python操作MySQL的小技巧
2020/09/10 Python
Pandas之缺失数据的实现
2021/01/06 Python
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
国际贸易个人求职信范文
2014/01/04 职场文书
学雷锋月活动总结
2014/04/25 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
python 破解加密zip文件的密码
2021/04/22 Python