html5 canvas手写画板 下载图片至本地

这篇博客介绍了如何使用HTML5的Canvas元素创建手写画板,并展示了如何将画布内容转化为图片并下载到本地。文章引用了菜鸟教程的Canvas指南,讲解了MouseEvent的pageX属性以及Canvas的toDataURL()方法,用于将画布内容转换为Base64编码的图片。

html5 canvas手写画板 下载图片至本地

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>canves</title>
	</head>
	<body>
		<div>
			<canvas id="canvas" width="600" height="400"></canvas>	
		</div>
		<label>画笔宽度:</label>
		<select id="sel">	
			<option value="4">4</option>
			<option value="8">8</option>
			<option value="16">16</option>
			<option value="30">30</option>
		</select>
		 画笔颜色:<input type="color" name="color1" id="color1"/><br />
		 	<br /><br /><br />
		<input type="button" value="生成图片" onclick="generate_picture()">
		<input type="button" value="下载图片" onclick="download_picture()"><br>
		<img id="image" src="" width="500px" height="200px">
	</body>

	
<script  type="text/javascript">
	var canvas=document.getElementById("canvas");
	var ctx=canvas.getContext("2d");
	//画一个黑色矩形
	ctx.fillStyle="#002200";//绘制填充颜色
	ctx.fillRect(0,0,600,400);//绘制一个被填充的矩形
	
	//按下标记
	var onoff=false;
	//定义起始位置
	var oldx=-10;
	var oldy=-10;
	//设置画笔颜色默认为白色
	var linecolor="white";
	//画笔宽度默认为4
	var linw=4;
	changeColor();
	
	//鼠标移动事件,事件绑定
	canvas.addEventListener("mousemove",draw);
	canvas.addEventListener("mousedown",down);
	canvas.addEventListener("mouseup",up);
	
	// 下笔时按下标记打开,给oldx、oldy赋值
	function down(event){
		console.log(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;
				// console.log(oldx);
				// console.log(newx);
				// console.log(oldy);
				// console.log(newy);
			}
	}		
	
	//改变下拉画笔宽度
	// 页面结束加载之后触发。HTML 事件
	window.onload=function(){
		var huabi=document.getElementById("sel");
		huabi.onchange=function(){//在元素值被改变时运行的脚本。
			linw=huabi.value;
		};
		//linw=huabi;
	};
	
	// 改变画笔颜色
	function changeColor(){
		var color1 = document.getElementById("color1");
		color1.onchange=function(){//在元素值被改变时运行的脚本。
			linecolor = color1.value; // 获得颜色赋值给画笔
		};
		//linw=huabi;
	};
	
	// 生成图片
	function generate_picture(){
		const dataImg = new Image();
		// canvas生成图片
		dataImg.src = canvas.toDataURL('image/png');
		// document.getElementById("image").src=canvas.toDataURL("image/jpg");
		document.getElementById("image").src=dataImg.src;
		//window.open("demo.htm", "height=100px, width=400px");
		//alert(document.getElementById("image"));
	};
	
	// 下载图片
	function download_picture(){
		const dataImg = new Image();
		dataImg.src = canvas.toDataURL('image/png');
		document.querySelector('#image').appendChild(dataImg)
		const alink = document.createElement("a");
		alink.href = dataImg.src;
		alink.download = "testImg.jpg";
		alink.click();
	}
</script>
	
	<style>
	/* cursor属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状 */
		#canvas{cursor:crosshair;}
	</style>
</html>

菜鸟教程canvas介绍
https://www.runoob.com/html/html5-canvas.html
菜鸟教程canvas参考手册
https://www.runoob.com/tags/ref-canvas.html

(1)后台打印出的鼠标事件MouseEvent
鼠标事件,MouseEvent.pageX,鼠标指针相对于整个文档的X坐标;
这个属性将基于文档的边缘,考虑任何页面的水平方向上的滚动。举个例子,如果页面向右滚动 200px 并出现了滚动条,这部分在窗口之外,然后鼠标点击距离窗口左边 100px 的位置,pageX 所返回的值将是 300。
参考网址:https://developer.mozilla.org/zh-CN/docs/Web/API/MouseEvent

(2)canvas学习——toDataURL()方法#
toDataURL()是canvas对象的一种方法,用于将canvas对象转换为base64位编码;
toDataURL()方法的两个参数:toDataURL(type, encoderOptions)

  • type指定转换为base64编码后图片的格式,如:image/png、image/jpeg、image/webp等等,默认为image/png格式;
  • encoderOptions用于设置转换为base64编码后图片的质量,取值范围为0-1,超出取值范围用默认值0.92代替;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值