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 相关文章推荐
使用Modello编写JavaScript类
Dec 22 Javascript
Jquery ajaxsubmit上传图片实现代码
Nov 04 Javascript
JavaScript之编码规范 推荐
May 23 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
Sep 29 Javascript
jQuery使用之设置元素样式用法实例
Jan 19 Javascript
JavaScript去除数组里重复值的方法
Jul 13 Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 Javascript
React Native开发封装Toast与加载Loading组件示例
Sep 08 Javascript
React实现全局组件的Toast轻提示效果
Sep 21 Javascript
详解vue或uni-app的跨域问题解决方案
Feb 21 Javascript
js代码编写无缝轮播图
Sep 13 Javascript
手写实现JS中的new
Nov 07 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
帅气的琦玉老师
2020/03/02 日漫
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
关于jQuery中的end()使用方法
2011/07/10 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
vuejs简单验证码功能完整示例
2019/01/08 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Python中pillow知识点学习
2018/04/30 Python
django序列化serializers过程解析
2019/12/14 Python
Python3的socket使用方法详解
2020/02/18 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
生物技术研究生自荐信
2013/11/12 职场文书
医学实习生自我鉴定
2013/12/12 职场文书
门诊手术室工作制度
2014/01/30 职场文书
企业办公室岗位职责
2014/03/12 职场文书
法务专员岗位职责
2015/02/14 职场文书
针对吵架老公保证书
2015/05/08 职场文书