【JavaScript】基于H5 canvas实现的画板绘图工具(类似你画我猜)——整合颜色选取、保存图片到本地功能


本来想尝试用做一个网页版的美图秀秀,可以导入的对图片进行处理,还有制作一些模板可以快速生成人物的表情包,但是做着做着,发现太耗时间了。结果最终只是简单做了一个基于 canvas 的画板。


github地址:https://github.com/linhongbijkm/canvasPainter

在线DEMO:https://linhongbijkm.github.io/canvasPainter/cvs.html





单纯实现 canvas 绘画功能还是比较简单的,以下我只大概说一下绘画功能的实现,至于页面中还包括颜色选择器、图像保存到本地的功能,请到 github 代码仓库下载下来看看。


一、canvas 标签

这个标签定义了一个画布,然后是要用 JavaScript 来调用浏览器 API 来在画布上绘图,所以第一步,就是在页面上加入 canvas 标签;

	<body>
		<canvas id="canvas" width="800px" height="600px"></canvas>
	</body>


二、读取画布

跟 JS 获取其他元素一样,根据 canvas 标签定义的 id 值,用原生函数来选取 canvas 元素,然后调用 getContext('2d') 获取画布环境对象,之后对画布绘图的 API 都由环境对象来调用;

	<script>
		var canvas = document.getElementById('canvas');
		var cvs = canvas.getContext('2d');
	</script>


三、定义画笔的颜色和粗细

	var penWeight = 1;		//画笔粗细
	var penColor = '#f00';	//画笔颜色


四、监听鼠标点下时事件

鼠标一点下,就开始一次绘画,画笔的起始点是当前鼠标位置,同时设置画笔的属性;

	canvas.onmousedown = function(e){

		/*找到鼠标(画笔)的坐标*/
		var start_x = e.clientX - canvas.offsetLeft + document.body.scrollLeft;
		var start_y = e.clientY - canvas.offsetTop + document.body.scrollTop;

		cvs.beginPath();	//开始本次绘画

		cvs.moveTo(start_x, start_y);	//画笔起始点

		/*设置画笔属性*/
		cvs.lineCap = 'round';
		cvs.lineJoin ="round";
		cvs.strokeStyle = penColor;		//画笔颜色
		cvs.lineWidth = penWeight;		//画笔粗细
		
		/*监听鼠标移动事件*/
		/*监听鼠标松开事件*/
	}


五、监听鼠标移动和松开事件

为了节省性能,在鼠标松开时候,取消鼠标按住和移动的监听,也就是只有鼠标按下时才监听鼠标移动和松开事件;

	canvas.onmousemove = function(e){

		/*找到鼠标(画笔)的坐标*/
		var move_x = e.clientX - canvas.offsetLeft + document.body.scrollLeft;
		var move_y = e.clientY - canvas.offsetTop + document.body.scrollTop;
		
		cvs.lineTo(move_x, move_y);	//根据鼠标路径绘画

		cvs.stroke();	//立即渲染
	}

	canvas.onmouseup = function(e){

		cvs.closePath();	//结束本次绘画

		canvas.onmousemove = null;
		canvas.onmouseup = null;
	}





整合以上五点,单纯绘图功能的代码如下:

(注:不包含颜色选取、橡皮擦、清空画布功能。如果需要完整版,请到github下载,地址在本文最前面)


<body>
	<canvas id="canvas" width="800px" height="600px"></canvas>
</body>

<script>
	var canvas = document.getElementById('canvas');
	var cvs = canvas.getContext('2d');

	var penWeight = 1;		//画笔粗细
	var penColor = '#f00';	//画笔颜色

	canvas.onmousedown = function(e){

		/*找到鼠标(画笔)的坐标*/
		var start_x = e.clientX - canvas.offsetLeft + document.body.scrollLeft;
		var start_y = e.clientY - canvas.offsetTop + document.body.scrollTop;

		cvs.beginPath();	//开始本次绘画

		cvs.moveTo(start_x, start_y);	//画笔起始点

		/*设置画笔属性*/
		cvs.lineCap = 'round';
		cvs.lineJoin ="round";
		cvs.strokeStyle = penColor;		//画笔颜色
		cvs.lineWidth = penWeight;		//画笔粗细


		canvas.onmousemove = function(e){

			/*找到鼠标(画笔)的坐标*/
			var move_x = e.clientX - canvas.offsetLeft + document.body.scrollLeft;
			var move_y = e.clientY - canvas.offsetTop + document.body.scrollTop;
			
			cvs.lineTo(move_x, move_y);		//根据鼠标路径绘画

			cvs.stroke();	//立即渲染
		}


		canvas.onmouseup = function(e){

			cvs.closePath();	//结束本次绘画

			canvas.onmousemove = null;
			canvas.onmouseup = null;
		}
	}
</script>


运行一下代码看看,比完整版简陋很多:








好的,以下是一个简单的实现: HTML 代码: ```html <!DOCTYPE html> <html> <head> <title>自定义画板</title> <meta charset="utf-8"> <style type="text/css"> canvas { border: 1px solid #ddd; } </style> </head> <body> <div> <button id="clearBtn">清空画板</button> <button id="saveBtn">保存图片</button> <label for="colorInput">选择颜色:</label> <input type="color" id="colorInput"> <label for="eraserInput">橡皮擦:</label> <input type="checkbox" id="eraserInput"> <label for="sizeInput">笔大小:</label> <input type="range" id="sizeInput" min="1" max="50" step="1" value="10"> </div> <canvas id="canvas" width="800" height="600"></canvas> <script type="text/javascript" src="script.js"></script> </body> </html> ``` 其中,我们用了一个 `<canvas>` 标签来实现画板,用了一些按钮和输入框来实现各种功能JavaScript 代码: ```javascript // 获取 canvas 元素和上下文 var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); // 设置默认颜色和大小 var color = '#000'; var size = 10; // 画板状态 var isDrawing = false; var isErasing = false; // 鼠标事件处理函数 function onMouseDown(event) { isDrawing = true; context.beginPath(); context.moveTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop); } function onMouseMove(event) { if (isDrawing) { if (isErasing) { context.clearRect(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop, size, size); } else { context.lineTo(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop); context.strokeStyle = color; context.lineWidth = size; context.stroke(); } } } function onMouseUp(event) { isDrawing = false; context.closePath(); } // 清空画板 function clearCanvas() { context.clearRect(0, 0, canvas.width, canvas.height); } // 保存图片 function saveImage() { var link = document.createElement('a'); link.download = 'canvas.png'; link.href = canvas.toDataURL(); link.click(); } // 更新颜色 var colorInput = document.getElementById('colorInput'); colorInput.addEventListener('change', function() { color = colorInput.value; }); // 切换橡皮擦 var eraserInput = document.getElementById('eraserInput'); eraserInput.addEventListener('change', function() { isErasing = eraserInput.checked; }); // 更新笔大小 var sizeInput = document.getElementById('sizeInput'); sizeInput.addEventListener('change', function() { size = sizeInput.value; }); // 绑定鼠标事件处理函数 canvas.addEventListener('mousedown', onMouseDown); canvas.addEventListener('mousemove', onMouseMove); canvas.addEventListener('mouseup', onMouseUp); // 绑定按钮事件处理函数 var clearBtn = document.getElementById('clearBtn'); clearBtn.addEventListener('click', clearCanvas); var saveBtn = document.getElementById('saveBtn'); saveBtn.addEventListener('click', saveImage); ``` 这段代码中,我们实现了以下功能: - 获取 canvas 元素和上下文 - 设置默认颜色和大小 - 画板状态 - 鼠标事件处理函数 - 清空画板 - 保存图片 - 更新颜色 - 切换橡皮擦 - 更新笔大小 - 绑定鼠标事件处理函数 - 绑定按钮事件处理函数 最后,我们将这些代码保存到 `script.js` 文件中,并在 HTML 中引入即可。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值