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 相关文章推荐
让innerText在firefox火狐和IE浏览器都能用的写法
May 14 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
May 07 Javascript
jquery图形密码实现方法
Mar 11 Javascript
JavaScript中的substr()方法使用详解
Jun 06 Javascript
JavaScript优化专题之Loading and Execution加载和运行
Jan 20 Javascript
javascript url几种编码方式详解
Jun 06 Javascript
详解angular中如何监控dom渲染完毕
Jan 03 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
Feb 15 Javascript
three.js中3D视野的缩放实现代码
Nov 16 Javascript
bootstrap响应式工具使用详解
Nov 29 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 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 function用法如何递归及return和echo区别
2014/03/07 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
javaScript实现游戏倒计时功能
2018/11/17 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
vant实现购物车功能
2020/06/29 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
用python写PDF转换器的实现
2020/10/29 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
数控专业毕业生求职信范文
2013/09/21 职场文书
建筑专业自荐信范文
2014/01/05 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
环保宣传语大全
2015/07/13 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书