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中单选框和复选框获取值的方式
Nov 06 Javascript
jquery实现div拖拽宽度示例代码
Jul 31 Javascript
js实现用户注册协议倒计时的方法
Jan 21 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
Bootstrap导航条鼠标悬停下拉菜单
Jan 04 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
Jan 19 Javascript
微信JSSDK调用微信扫一扫功能的方法
Jul 25 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
Mar 06 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
浅谈Vue数据响应
Nov 05 Javascript
jQuery 操作 HTML 元素和属性的方法
Nov 12 jQuery
mpvue小程序循环动画开启暂停的实现方法
May 15 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之第一天
2006/10/09 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
Symfony核心类概述
2016/03/17 PHP
php的debug相关函数用法示例
2016/07/11 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Javascript 对象的解释
2008/11/24 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
vue实现计步器功能
2019/11/01 Javascript
简介Django框架中可使用的各类缓存
2015/07/23 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
python语言中有算法吗
2020/06/16 Python
Python 图片处理库exifread详解
2021/02/25 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
教育学习自我评价
2014/02/03 职场文书
大学应届生的自我评价
2014/03/06 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
教师节班会开场白
2015/06/01 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书