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 相关文章推荐
Domino中运用jQuery读取视图内容的方法
Oct 21 Javascript
Javascript的一种模块模式
Sep 08 Javascript
js操作iframe的一些方法介绍
Jun 25 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 Javascript
jQuery右下角悬浮广告实例
Oct 17 Javascript
微信小程序 扎金花简单实例
Feb 21 Javascript
vue构建单页面应用实战
Apr 10 Javascript
使用 Node.js 对文本内容分词和关键词抽取
May 27 Javascript
Vue.set()实现数据动态响应的方法
Feb 07 Javascript
Vue登录注册并保持登录状态的方法
Aug 17 Javascript
利用promise及参数解构封装ajax请求的方法
Mar 24 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
react高阶组件添加和删除props
2019/04/26 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python中列表元素连接方法join用法实例
2015/04/07 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
深入理解Python对Json的解析
2017/02/14 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
UNIX特点都有哪些
2016/04/05 面试题
后勤工作职责
2013/12/22 职场文书
小学后勤管理制度
2014/01/14 职场文书
领导干部培训感言
2014/01/23 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
责任书格式范文
2014/07/28 职场文书
浅谈MySQL函数
2021/10/05 MySQL