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 相关文章推荐
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
Mar 06 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
jquery的clone方法应用于textarea和select的bug修复
Jun 26 Javascript
js给selected添加options的方法
May 06 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
Angular路由简单学习
Dec 26 Javascript
jQuery实现字体颜色渐变效果的方法
Mar 29 jQuery
gulp解决跨域的配置文件问题
Jun 08 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
微信小程序之数据缓存的实例详解
Sep 29 Javascript
vue中实现先请求数据再渲染dom分享
Mar 17 Javascript
node打造微信个人号机器人的方法示例
Apr 26 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处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
Javascript之String对象详解
2016/06/08 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
仅利用30行Python代码来展示X算法
2015/04/01 Python
Python实时获取cmd的输出
2015/12/13 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
Python如何在bool函数中取值
2020/09/21 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
德国足球商店:OUTFITTER
2019/05/06 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
技校教师求职简历的自我评价
2013/10/20 职场文书
测绘工程个人的自我评价
2013/11/10 职场文书
师范教师毕业鉴定
2014/01/13 职场文书
素质拓展感言
2014/01/29 职场文书
家长寄语大全
2014/04/02 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS