canvas导出为图片并用JS下载

本文介绍如何使用HTML5 Canvas实现绘图功能,并通过修改MIME类型将绘制的内容导出为图片,最后实现下载功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、从canvas中直接提取图片元数据

// 图片导出为 png 格式
var type = 'png';
var imgData = canvas.toDataURL(type);

上面的代码得到的数据格式为:data:image/png;base64,.....

2、将mime-type改为image/octet-stream,强制让浏览器直接download

/**
 * 获取mimeType
 * @param  {String} type the old mime-type
 * @return the new mime-type
 */
var _fixType = function(type) {
    type = type.toLowerCase().replace(/jpg/i, 'jpeg');
    var r = type.match(/png|jpeg|bmp|gif/)[0];
    return 'image/' + r;
};
   
// 加工image data,替换mime type
imgData = imgData.replace(_fixType(type),'image/octet-stream');

上面这个代码得到的数据格式为:data:image/octet-stream;base64,.....

3、图片download到本地

/**
 * 在本地进行文件保存
 * @param  {String} data     要保存到本地的图片数据
 * @param  {String} filename 文件名
 */
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'truefalse, window, 0, 0, 0, 0, 0, falsefalsefalsefalse, 0, null);
    save_link.dispatchEvent(event);
};
   
// 下载后的问题名
var filename = 'baidufe_' + (new Date()).getTime() + '.' + type;
// download
saveFile(imgData,filename);

测试页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DEMO6:自定义画板</title>
</head>
<body>
<canvas id="canvas" width="600" height="300">
浏览器不支持canvas   <!-- 如果不支持会显示这段文字 -->
</canvas>
<br/>
<button style="width:78px;background-color:yellow;" οnclick='linecolor="yellow";'>黄</button>
<button style="width:78px ;background-color:red;" οnclick='linecolor="red";'>红</button>
<button style="width:78px ;background-color:blue;" οnclick='linecolor="blue";'>蓝</button>
<button style="width:78px ;background-color:green;" οnclick='linecolor="green";'>绿</button>
<button style="width:78px ;background-color:white;" οnclick='linecolor="white";'>白</button>
<button style="width:78px ;background-color:gray;" οnclick='linecolor="gray";'>灰</button>
<button style="width:78px ;background-color:pink;" οnclick='linecolor="pink";'>粉</button>
<br/>
<br/>
<button style="width: 80px;background-color: white;" οnclick="linw=4;">细</button>
<button style="width: 80px;background-color: white;" οnclick="linw=8;">中</button>
<button style="width: 80px;background-color: white;" οnclick="linw=16;">粗</button>
&nbsp;&nbsp;&nbsp;&nbsp;
<button style="width: 80px;background-color: white;" οnclick="copyimage();">预览</button>
<button style="width: 80px;background-color: white;" οnclick="downloadimage();">下载</button>
<br/>




<br/>
<img src="" id="image_png" width="600px" height="300px">
<br/>


<script type="text/javascript">
var canvas = document.getElementById('canvas');  //获取标签
var ctx = canvas.getContext("2d");  


var fillStyle = "black";
ctx.fillRect(0,0,600,300);
var onoff = false;  //按下标记
var oldx = -10;
var oldy = -10;
//设置颜色
var linecolor = "white";
var linw = 4;
canvas.addEventListener("mousemove",draw,true);  //鼠标移动事件
canvas.addEventListener("mousedown",down,false);  //鼠标按下事件
canvas.addEventListener("mouseup",up,false);  //鼠标弹起事件
function down(event){
onoff = true;
oldx = event.pageX - 10;
oldy = event.pageY - 10;
}
function up(){
onoff = false;
}
function draw(event){
if (onoff==true) {
var newx = event.pageX - 10;
var newy = event.pageY - 10
ctx.beginPath();
ctx.moveTo(oldx,oldy);
ctx.lineTo(newx,newy);
ctx.strokeStyle = linecolor;
ctx.lineWidth = linw;
ctx.lineCap = "round";
ctx.stroke();


oldx = newx;
oldy = newy;
}
}
function copyimage(event)
{
var img_png_src = canvas.toDataURL("image/png");  //将画板保存为图片格式的函数
document.getElementById("image_png").src = img_png_src;
}

function downloadimage(event)
{
// 图片导出为 png 格式
var type = 'png';
// 返回一个包含JPG图片的<img>元素
var img_png_src = canvas.toDataURL("image/png");  //将画板保存为图片格式的函数
// 加工image data,替换mime type
imgData = img_png_src.replace(_fixType(type),'image/octet-stream');
// 下载后的问题名
var filename = '个人画板_' + (new Date()).getTime() + '.' + type;
// download
saveFile(imgData,filename);
}

/**
* 在本地进行文件保存
* @param  {String} data     要保存到本地的图片数据
* @param  {String} filename 文件名
*/
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);
};

/**
* 获取mimeType
* @param  {String} type the old mime-type
* @return the new mime-type
*/
var _fixType = function(type) {
   type = type.toLowerCase().replace(/jpg/i, 'jpeg');
   var r = type.match(/png|jpeg|bmp|gif/)[0];
   return 'image/' + r;
};
</script> 
</body>
</html>




喜欢的朋友可以扫描我的个人公众号,有好东西可以一起分享。

也可以微信搜索公众号:Java程序员那些事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值