canvas保存图片到本地
canvas可用来做很多的事情,当我们用canvas来显示一些图标时,又希望能够直接下载这些图片时,我们可以会遇到一些问题。
绘制canvas图像
绘制不是这儿的重点,所以就画个简单的图像,直接pass了。
<canvas id="canvas" width="300" height="300"></canvas>
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.moveTo(20, 20);
context.lineTo(280, 280);
context.moveTo(280, 20);
context.lineTo(20, 280);
context.stroke();
这样的话,我们可以得到一个'X'的图像了。
生成图片
这儿我们就要用到canvas中的toDataURL方法了。
HTMLCanvasElement.toDataURL(type, encoderOptions)
该方法返回一个包含图片展示的 data URI 。可以使用 type(MIME type)
参数其类型,默认为image/png( PNG 格式)。图片的分辨率为96dpi。encoderOptions是指在图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。
其中:
- 返回值是一个String。
- 如果画布的高度或宽度是0,那么会返回字符串“data:,”
- 如果传入的类型非“image/png”,但是返回的值以“data:image/png”开头,那么该传入的类型是不支持的
- Chrome支持“image/webp”类型
我们可以看下该图片的Base64编码形式的字符串。
var base64Img = canvas.toDataURL();
console.log(base64Img);
// data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAQvUlEQ…CIIEBYEVSdiQACIQQIKwSrQxFAIIIAYUVQdSYCCIQQ+D+vgA9pZtPoQAAAAABJRU5ErkJggg==
下载图片
平时我们用到的下载都是经过服务器的,现在我们选择使用HTML5中的一个新属性download处理图片下载的问题,ie下的话会有兼容性的问题。 新增一个button元素:
<button id="btn">下载图片</button>
document.getElementById('btn').addEventListener('click', function() {
var base64Img = canvas.toDataURL();
var oA = document.createElement('a');
oA.href = base64Img;
oA.download = '111.png'; // 下载的文件名可以此处修改
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
oA.dispatchEvent(event);
// 以上三行的模拟触发事件可以用 oA.click();替代
// 若是触发不了下载,可以尝试将a标签append到body中,当然最后不要忘了把他remove掉。
});
配合上事件点击,我们就可以下载图片了,但是直接下载到下载目录下的。在火狐中,这会弹出下载的对话框。要在chrome下也弹出对应的另存为的框,可以在设置中打开每次下载询问下载路径。
注:目前只在chrome和火狐下有效果。
至于想要其他的图片格式,那么就可以使用前面说到的方法了。