htmlcanvas2实现将网页生成图片,自定义保存图片的名称
来源:互联网 发布:拳皇97 mac 编辑:程序博客网 时间:2024/04/27 14:02
首先熟悉htmlcanvas2的使用方法,看看github的使用说明
https://github.com/niklasvh/html2canvas
html2canvas(document.body).then(function(canvas) { document.body.appendChild(canvas); });
这是我要截取的网页的html效果图
使用htmlcanvas2需要注意一下几个坑(这都是我一个一个踩过的):
1 如果你截取的网页中有图片和文字,在本地测试时生成图片时,网页中的图片截取出来竟然是空白?
(心里在想:什么狗屁插件根本不管用 图片都截取不了)
原因:程序必须放在服务器下运行,不然的话网页中的图片是出不来的
2 把程序放在服务器上运行了,发现图片还是出不来,有图片的地方还是一片空白?生成的图片效果是这样的
为什么一个二维码图片可以出来,另一个二维码图片没有出来?这就要从二维码身上找原因了
我的二维码的生成用到了这个插件jquery.qrcode-logo.js,调用方法如下:
$("#code").qrcode({ render : "canvas",text: pay_url,width:312,height:312,src: 'http://css.zzebz.com/images/kkbl.jpg'});
发现两个二维码的调用区别是多了一个 src: 'http://css.zzebz.com/css//images/kkbl.jpg' 就是二维码中间的logo小图片,这个依然是图片的跨域问题,所以我们一定要避免截取的网页中的图片跨域问题!把这个路径换成本地路径 src: '__STATIC__/images/kkbl.jpg';
这里还会存在一个问题,在jquery.qrcode-logo的二维码没有生成之前htmlcanvas已经开始生成图片了,这样生成的图片中的二维码是空白,
所以htmlcanvas2的执行要延迟1s。现在生成图片之后是可以手动 右键鼠标 将图片另存为 保存图片的。这样截图就OK了,代码如下:
setTimeout(function(){html2canvas($("#view"), {onrendered: function(canvas) {$("#qrbox").append(canvas);}});},1000);如果我想在保存图片的时候可以自定义图片的名称该如何做?我从网上搜到一段代码如下:
var type = 'png';var imgData = canvas.toDataURL(type);var _fixType = function(type) {type = type.toLowerCase().replace(/jpg/i, 'jpeg');var r = type.match(/png|jpeg|bmp|gif/)[0];return 'image/' + r;};imgData = imgData.replace(_fixType(type),'image/octet-stream');var saveFile = function(data, filename){var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');save_link.href = data;save_link.download = filename;var event = document.createEvent('MouseEvents');event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);save_link.dispatchEvent(event);};var filename = shopname + '.' + type;saveFile(imgData,filename);
html2canvas2生成的图片是一个大的canvas,只有获取到了这个canvas才可以自定义保存图片的名称,
这里的关键在于如何获取到这个canvas,这个canvas上并没有id 什么都没有
首先想到的通过id="qrbox"获取里边的子元素
var can = document.getElementById("qrcode").getElementsByTagName("canvas")[0];console.log(can);结果:<canvas width="120" height="120"></canvas>
得到的canvas是这样的 宽高是120的canvas,这个canvas竟然不是那张大图片的canvas,而是右下角jquery.qrcode-logo生成的那张二维码?这里非常的怪异!
尝试着获取#qrcode的第一个子元素第二个子元素,全部是undefined,通过qrbox中的子元素来获取这个大的canvas失败了!!
所以我就想到如何为htmlcanvas2生成的这个大的canvas增加一个id,这样就要修改htmlcanvas2源码了
源码三千多行,其实我的内心是崩溃的,多半这个id是不好加上的
我在想既然htmlcanvas2绘制出了这个大的canvas,那我就去找源码中绘制canvas的代码createElement("canvas"),绘制的时候就手动增加id,就这样一个一个的打出来试试
第一处:var croppedCanvas = document.createElement("canvas");croppedCanvas.setAttribute("id","myCanvas");console.log(croppedCanvas);第二处:this.canvas = this.options.canvas || this.document.createElement("canvas");this.canvas.setAttribute("id","myCanvas");console.log(this.canvas);第三处:var ctx, canvas = document.createElement('canvas');canvas.setAttribute("id","myCanvas");canvas.setAttribute("id","myCanvas");console.log(canvas);canvas.width = size.width;canvas.height = size.height; ...................就不一一列出了
令我惊喜的是,终于得到了我想要的id,现在就可以用id来找到这个canvas了,结合我的项目修改之后自定义保存图片名称的完整代码如下:
var shopname = "糖猫猫的店铺";var c = document.getElementById("myCanvas");console.log(c);document.getElementById("btnsave").addEventListener("click",function(){if(c==null){alert("获取数据失败,请刷新页面!");return false;}var type = 'png';var imgData = c.toDataURL(type);var _fixType = function(type) {type = type.toLowerCase().replace(/jpg/i, 'jpeg');var r = type.match(/png|jpeg|bmp|gif/)[0];return 'image/' + r;};imgData = imgData.replace(_fixType(type),'image/octet-stream');var saveFile = function(data, filename){var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');save_link.href = data;save_link.download = filename;var event = document.createEvent('MouseEvents');event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);save_link.dispatchEvent(event);};var filename = shopname + '.' + type;saveFile(imgData,filename);});
这是什么编辑器真的不好用,编辑出来的都是什么格式!重新弄了无数次!!!
参考文章:http://blog.csdn.net/qq547276542/article/details/51906741
- htmlcanvas2实现将网页生成图片,自定义保存图片的名称
- 将网页保存为图片
- 将网页保存成图片插件
- PhantomJS将网页保存为图片
- 保存网页图片的方法
- 如何将图片保存至自定义分组
- php 利用cutycapt 将网页生成图片
- 网页保存为图片
- asp.net 实现输入网址生成当前网页的图片
- 保存网页图片的八种方法
- java如何保存网页上的图片
- 根据网站地址将网页保存为图片(网页快照)
- 谷歌浏览器将网页保存为图片或者pdf
- 将图片保存到沙盒
- 如何实现图片的上传以及将图片保存到Mysql
- ASP.NET利用.FileUpload上传图片并将图片名称保存到数据库
- 网页生成图片代码 IViewObject接口实现
- 将网页保存成图片的Firefox插件 Pearl Crescent Page Saver Basic 2.5
- Kotlin 设计模式-建造者
- 新到linux服务器硬件配置检查项
- Android IP地址查看
- Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法
- Appium + android + java + 实例
- htmlcanvas2实现将网页生成图片,自定义保存图片的名称
- NIO Buffer
- QT添加外部插件qwt到designer上
- day01 嵌入式开发环境配置
- lengthb 函数和 length 函数
- 自顶向下深入分析Netty(七)--ChannelHandlerContext源码实现
- 对于JAVA多态的理解
- 将相对路径转绝对路径
- Android Binder设计与实现 – 设计篇: