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实现的仿sohu博客更换页面风格(简单版)
Mar 22 Javascript
javascript web对话框与弹出窗口
Feb 22 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
Nov 19 Javascript
使用js 设置url参数
Jul 08 Javascript
jquery实现邮箱自动补全功能示例分享
Feb 17 Javascript
JavaScript极简入门教程(三):数组
Oct 25 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
Nov 04 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
Aug 14 Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 Javascript
bootstrap table.js动态填充单元格数据的多种方法
Jul 18 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
Jul 19 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
Apr 03 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
php实现微信支付之企业付款
2018/05/30 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
JavaScript对象模型-执行模型
2008/04/28 Javascript
JavaScript类库D
2010/10/24 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
SVG描边动画
2017/02/23 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
Python中super关键字用法实例分析
2015/05/28 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
Servlet如何得到客户端机器的信息
2014/10/17 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
生态学毕业生自荐信
2013/10/27 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
上课迟到检讨书
2014/02/19 职场文书
艺术节开幕词
2015/01/28 职场文书
安全责任书
2015/01/29 职场文书
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python