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 相关文章推荐
aspx中利用js实现确认删除代码
Jul 22 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
Sep 11 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
javascript数字时钟示例分享
Apr 23 Javascript
AngularJS基础 ng-model-options 指令简单示例
Aug 02 Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
Mar 06 Javascript
vue iView 上传组件之手动上传功能
Mar 16 Javascript
默认浏览器设置及vue自动打开页面的方法
Sep 21 Javascript
React中获取数据的3种方法及优缺点
Feb 18 Javascript
vue组件系列之TagsInput详解
May 14 Javascript
swiper4实现移动端导航栏tab滑动切换
Oct 16 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
php5中类的学习
2008/03/28 PHP
php密码生成类实例
2014/09/24 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
使用console进行性能测试
2015/04/27 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
js实现拖拽功能
2017/03/01 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python实现Restful API的例子
2019/08/31 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
大学本科生职业生涯规划书范文
2014/09/14 职场文书
军人离婚协议书样本
2014/10/21 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
2019银行竞聘书
2019/06/21 职场文书
Python中常见的导入方式总结
2021/05/06 Python