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 相关文章推荐
utf8的编码算法 转载
Dec 27 Javascript
JavaScript入门教程(2) JS基础知识
Jan 31 Javascript
JavaScript 获得选中文本内容的方法
Feb 15 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
Apr 10 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
微信小程序前端源码逻辑和工作流
Sep 25 Javascript
Angular 中 select指令用法详解
Sep 29 Javascript
js中json处理总结之JSON.parse
Oct 14 Javascript
JavaScript调试之console.log调试的一个小技巧分享
Aug 07 Javascript
实现一个完整的Node.js RESTful API的示例
Sep 29 Javascript
vue实现动态列表点击各行换色的方法
Sep 13 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/08 国漫
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
python实现大转盘抽奖效果
2019/01/22 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
物流仓管员工作职责
2014/01/06 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
2014年秘书工作总结
2014/11/25 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
民间借贷借条如何写
2015/05/26 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书