前  言

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制作画图工具的更多相关文章

  1. canvas防画图工具

    <style> body {   background: black;   text-align: center; } #cans {   background: white; } < ...

  2. 用Canvas制作简单的画图工具

    今天用Canvas制作了一个画图工具,非常简单,功能也不是很多,主要有背景网格,画线,画圆,画矩形和画圆角矩形,也用到了canvas的一些基本知识,在这里一一列举. 1.线段的绘制: 如何绘制真正的1 ...

  3. HTML5简易在线画图工具

    继上次学习了HTML5的路径画圆做了动态时钟.异次元空间的反转做了运动的太阳系,这两天将画线.画圆.填充等知识点结合起来做了一个简易的在线画图工具: 查看DEMO:HTML5简易在线画图工具 功能包括 ...

  4. H5上传图片并使用canvas制作海报

    马上就要"十一"国庆节了,又恰逢公司已经三周岁了,所以市场部和产品共同策划了一个"正青春,共成长"的主题代言活动,准备在国庆节以及中秋节期间让公司员工和用户为公 ...

  5. 使用Canvas制作时钟动画

    复习Javascript到Canvas的知识点,看到一个使用Canvas绘制的静态时钟例子,便想将其变成动态显示系统时间的时钟动画.另外再配上数字显示的时钟,一个小的时钟模块的诞生了!目前的界面还比较 ...

  6. Plantuml画图工具

    1,Plantuml画图工具 安装指南: Mac sublimetext http://blog.csdn.net/zhangjikuan/article/details/53365730 win i ...

  7. JavaFx 实现画图工具

    制作一款类似于Windows画图工具程序 功能需求: (1)在画布上绘制直线.曲线.矩形.椭圆等图形 (2)实现输入文字,橡皮擦 (3)可以绘制填充图形以及设置画笔的颜色和粗细 (4)实现撤销操作.保 ...

  8. 使用canvas制作五子棋游戏

    要制作JS五子棋的话我们可以一开始来理清一下思路,这样对我们后来的编程是有好处的 1.棋盘使用canvas制作.canvas用来做这种不用太过复杂的图形的时候是很有用处的,下图是我制作的一个五子棋棋盘 ...

  9. 还在用visio?这款画图工具才是真的绝!

    最近有读者私信我,问我推文的配图是用什么工具画的,很好看,也想学习一下.今天就给大家介绍一下这款画图工具--Draw.io 概述 draw.io是一款免费的网页版画图工具(也有桌面版),支持流程图.U ...

随机推荐

  1. Codeforces 965E Short Code 启发式合并 (看题解)

    Short Code 我的想法是建出字典树, 然后让后面节点最多的点优先向上移到不能移为止, 然后gg. 正确做法是对于当前的节点如果没有被占, 那么从它的子树中选出一个深度最大的点换到当前位置. 用 ...

  2. HDU4858 项目管理 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU4858.html 题目传送门 - HDU4858 题意 给定一个无向图 $n$ .有 $m$ 条边. 每一 ...

  3. HYSBZ 4034 【树链剖分】+【线段树 】

    <题目链接> 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权值.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...

  4. Django 学习第三天——模板变量及模板过滤器

    一.模板路径的查找: 查找顺序:(现在哪找到就用那个) 首先在主目录的 setting.py 文件里的 TEMPLATES 中的 DIRS 里找: 其次如果 DIRS 中的 APP_DIRS : 'T ...

  5. 利用svg描边+css3实现边框逐渐消失小动画

    首先简单的描述一下svg中两个属性: stroke-dasharray:表示每个虚线的长短. stroke-dashoffset:表示首个虚线的偏移量. 当两者都特别大的时候就会消失掉 直接上代码: ...

  6. mongodb安装、配置

    1.下载: https://www.mongodb.com/download-center#community 2.进入到mongodb下载目录: a .新建data目录:mkdir data; b. ...

  7. python 函数递归与匿名函数

    1.什么是函数递归? 函数递归调用(是一种特殊的嵌套调用):在调用的函数过程中,又直接或者间接的调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调每进入下一层递归问题的规 ...

  8. ae:org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be authenticated by any configured realms. Please ensure

    看问题是说要保证有一个realm正确,但是之前运行就一直成功,后来就不行了.有可能是:以为自己输入了正确的用户名和密码,结果是因为用户名前面添加了空格导致了这个错误发生. 实质问题是:你输入的用户名和 ...

  9. 记录下pytorch代码从0.3版本迁移到0.4版本要做的一些更改。

    1. UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to in ...

  10. 小甲鱼Python第十六讲课后习题--017函数

    函数的定义用def,函数名后要用冒号 函数的返回:函数中使用return   测试题: 0. 你有听说过DRY吗? DRY是指Don't Repeat Yourself ,特指在程序设计以及计算中避免 ...