使用Canvas制作画图工具
前 言
JRedu
canvas是HTML5中重要的元素之一,canvas元素使用JavaScript在网页上绘制图像,画布是一个矩形区域,我们可以控制其每一个元素,并且canvas拥有多种的绘制路径、矩形、圆形、字符以及添加图像的方法。 这一章我们使用canvas来做一个画图工具,并且支持下载图片功能。
最终实现界面
最终实现界面如下,当然我这种手残党是画不出来,手动@陈冲老师画的:

画图工具实现的主要功能
1.画笔颜色和粗细点击选取
2.橡皮擦
3.清除画布
4.下载图片
在实现主要功能之前,首先要放置canvas画布,实现在规定区域内随意画图的功能,实现的原理是获取鼠标点击之后的位置,利用鼠标的点击、移动事件来实现绘画。实现代码如下:
设置全局变量
var canvas = document.getElementById('canvas');
var cvs = canvas.getContext('2d');
var drawing =false;
Html代码:
<canvas id="canvas" width="800px" height="600px" style="border: 1px solid red;"></canvas>
Js代码:
window.onload = function(){
var penWeight = 0; //画笔粗细
var penColor = ''; //画笔颜色
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;
}
canvas.onmouseleave = function(){
cvs.closePath();
canvas.onmousemove = null;
canvas.onmouseup = null;
}
}
}
1画笔颜色和粗细点击选取
这里我分别从画笔颜色和画笔粗细中个选取一个作为例子来简述以下如何实现:
从上边的代码中可以了解到控制画笔粗细和颜色的分别是penWeight和penColor,也就是说,我们可以通过修改这两个变量从而实现改变画笔属性的功能,代码如下:
Html代码:
<input type="button" value="粗" class="bold btn" onclick="checkpen(10)" />
<input type="button" value="红" class="red item" style="background-color: red;border: none;" onclick="changecolor('red')" />
Js代码:
function checkpen(width){ //设置笔的粗细
cvs.lineWidth = width;
}
function changecolor(pencolor){ //设置颜色
cvs.strokeStyle =pencolor;
}
2橡皮擦
选中橡皮擦之后提示正在使用,利用鼠标移动,点击事件实现橡皮擦的功能,其中cvs.globalCompositeOperation = "destination-out"; 可以实现橡皮擦点击经过的地方显示原始背景色。代码实现如下:
Html代码:
<input type="button" value="橡皮擦" class="eraser btn" id="eraser" onclick="checkeraser()" />
<input type="button" value="取消橡皮擦" class="uneraser btn" id="uneraser" onclick="canceleraser()" />
Js代码:
//选中橡皮擦
function checkeraser(){
document.getElementById("eraser").value = "正在使用...";
cvs.lineWidth = 20;
cvs.globalCompositeOperation = "destination-out";
function getBoundingClientRect(x,y){
var box = canvas.getBoundingClientRect(); //获取canvas的距离浏览器视窗的上下左右距离
return {x:x-box.left,
y:y-box.top
}
}
canvas.onmousedown = function(e){
var first = getBoundingClientRect(e.clientX,e.clientY);
cvs.save();
cvs.beginPath();
cvs.moveTo(first.x,first.y);
drawing = true;
}
canvas.onmousemove = function(e){
if(drawing){
var move = getBoundingClientRect(e.clientX,e.clientY);
cvs.save();
cvs.lineTo(move.x,move.y);
cvs.stroke()
cvs.restore()
}
}
canvas.onmouseup = function(){
drawing = false;
}
canvas.onmouseleave = function(){
drawing = false;
canvas.onmouseup();
}
}
3清除画布
清空画布只需要调用clearRect() 方法,实现清空给定矩形内的指定像素。代码如下:
Html代码:
<input type="button" value="清除画布" class="clear fun" onclick="clearb()" />
Js代码:
//清除画布功能
function clearb (){
cvs.clearRect(0,0,800,800);
}
4下载图片
下载图片的部分代码和生成画布实现绘画的代码写在同一个方法中,一并贴出来了,可以自行删改。以下是实现代码:
Html代码:
<input type="button" value="清除画布" class="clear fun" onclick="clearb()" />
Js代码:
//保存图片
window.onload = function(){
var penWeight = 0; //画笔粗细
var penColor = ''; //画笔颜色
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;
}
canvas.onmouseleave = function(){
cvs.closePath();
canvas.onmousemove = null;
canvas.onmouseup = null;
}
}
var dlButton = document.getElementById("downloadImageBtn");
bindButtonEvent(dlButton,"click",saveAsLocalImage)
}
function bindButtonEvent(element, type, handler)
{
if(element.addEventListener) {
element.addEventListener(type, handler, false);
} else {
element.attachEvent('on'+type, handler);
}
}
function saveAsLocalImage () {
var myCanvas = document.getElementById("canvas");
var image = myCanvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
window.location.href=image;
}
如需源码,可戳右侧链接自行下载哦~http://www.jredu100.com/index.php?m=content&c=index&a=show&catid=65&id=39
出处:http://www.cnblogs.com/jerehedu/
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:

使用Canvas制作画图工具的更多相关文章
- canvas防画图工具
<style> body { background: black; text-align: center; } #cans { background: white; } < ...
- 用Canvas制作简单的画图工具
今天用Canvas制作了一个画图工具,非常简单,功能也不是很多,主要有背景网格,画线,画圆,画矩形和画圆角矩形,也用到了canvas的一些基本知识,在这里一一列举. 1.线段的绘制: 如何绘制真正的1 ...
- HTML5简易在线画图工具
继上次学习了HTML5的路径画圆做了动态时钟.异次元空间的反转做了运动的太阳系,这两天将画线.画圆.填充等知识点结合起来做了一个简易的在线画图工具: 查看DEMO:HTML5简易在线画图工具 功能包括 ...
- H5上传图片并使用canvas制作海报
马上就要"十一"国庆节了,又恰逢公司已经三周岁了,所以市场部和产品共同策划了一个"正青春,共成长"的主题代言活动,准备在国庆节以及中秋节期间让公司员工和用户为公 ...
- 使用Canvas制作时钟动画
复习Javascript到Canvas的知识点,看到一个使用Canvas绘制的静态时钟例子,便想将其变成动态显示系统时间的时钟动画.另外再配上数字显示的时钟,一个小的时钟模块的诞生了!目前的界面还比较 ...
- Plantuml画图工具
1,Plantuml画图工具 安装指南: Mac sublimetext http://blog.csdn.net/zhangjikuan/article/details/53365730 win i ...
- JavaFx 实现画图工具
制作一款类似于Windows画图工具程序 功能需求: (1)在画布上绘制直线.曲线.矩形.椭圆等图形 (2)实现输入文字,橡皮擦 (3)可以绘制填充图形以及设置画笔的颜色和粗细 (4)实现撤销操作.保 ...
- 使用canvas制作五子棋游戏
要制作JS五子棋的话我们可以一开始来理清一下思路,这样对我们后来的编程是有好处的 1.棋盘使用canvas制作.canvas用来做这种不用太过复杂的图形的时候是很有用处的,下图是我制作的一个五子棋棋盘 ...
- 还在用visio?这款画图工具才是真的绝!
最近有读者私信我,问我推文的配图是用什么工具画的,很好看,也想学习一下.今天就给大家介绍一下这款画图工具--Draw.io 概述 draw.io是一款免费的网页版画图工具(也有桌面版),支持流程图.U ...
随机推荐
- mysql基础理论
第一节数据库管理系统概述 在www.db-engines.com/en/ 这个网站中可以看到对数据库的排名 数据库分为: 关系型数据库: mysql------mariaDB oracle 非关系型数 ...
- zabbix http服务监控实例
1在被监控主机安装http服务 ,监听80端口 systemctl start httpd.service 启动服务 80端口已经启动 设定,监控80端口,当服务不当时先自动重启服务 2 ...
- 使用link rel="shortcut icon"为网页标题加图标
<title>会员卡券</title> <link rel="shortcut icon" href="http://GT/img/favi ...
- js写三级联动
<!DOCTYPE HTML> <html> <head> <title>联动菜单</title> <meta charset=&qu ...
- 微信小程序—文件系统
文件系统 文件系统是小程序提供的一套以小程序和用户维度隔离的存储以及一套响应的管理接口.通过wx.getFilesSystemManager()可以获取到全局唯一的文件管理器,所有文件管理操作通过Fi ...
- Spring日记_02之 json、javaBean、.do、MySql、MyBatis 环境搭建结束
JSON Json是JavaScript直接量语法 无参构造方法直接 Alt + \ 就可以提示添加 Project – Clean 浏览器向服务器发送请求,服务器中的Spring中的SpringMV ...
- Linux下C语言的socket网络编程
关于详细的服务器建立的步骤以及相关的socket套接字的知识我已经在python socket编程的文章中提到过了,大家可以参看那一篇博客来历接socket套接字编程的内容,由于要是用C相关的API所 ...
- LIS+二分法
http://poj.org/problem?id=3903 数列里是存从小到大排的数,二分也是为了这个服务的,不断更新.而len才是所求长度 #include <iostream> #i ...
- Dev-C++安装第三方库boost
Dev-C++安装第三方库boost 转 https://www.jianshu.com/p/111571e4d6f5?utm_source=oschina-app 之前鉴于codeblocks界面 ...
- Mysql:数据库导入导出
Mysql:数据库导入导出 Mysql数据库导出 mysqldump -h IP -u 用户名 -p 数据库名 > 导出的文件名 1.mysqldump是在cmd下的命令,需要在linux命令行 ...