前  言

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 725E Too Much Money (看题解)

    Too Much Money 最关键的一点就是这个贪心可以在sqrt(n)级别算出答案. 因为最多有sqrt(n)个不同的数值加入. 我们可以发现最优肯定加入一个. 然后维护一个当前可以取的最大值, ...

  2. 如何删除github里面的项目

    第一步 :首先登陆github 第二步:如下图选择 第三步:选择如下图 第四步:点击你要删除的项目,点击settings 第五步:把页面向下拉,找到如图按钮并点击 第六步:需要确认输入你要删除的项目名 ...

  3. 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)

    赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...

  4. 关于XML的简单整理

  5. CodeForces 371C Hamburgers(经典)【二分答案】

    <题目链接> 题目大意: 给以一段字符串,其中只包含"BSC"这三个字符,现在有一定量免费的'B','S','C‘,然后如果想再买这三个字符,就要付出相应的价格.现在总 ...

  6. 从URL输入到页面展现到底发生什么

    前言 打开浏览器从输入网址到网页呈现在大家面前,背后到底发生了什么?经历怎么样的一个过程?先给大家来张总体流程图,具体步骤请看下文分解!   从URL输入到页面展现 总体来说分为以下几个过程: DNS ...

  7. 持续集成时 travis 和 codecov 等 yaml 文件的配置

    最近在项目中在配置CodeCov 以及Travis 和 AppVeyor做持续集成时,遇到了一些问题,也解决了一些问题.顺便拿来分享一下. 首先时Travis,这个主要是来跑基于 Linux 环境下的 ...

  8. SpringMVC(二四) 视图解析流程

    目标方法无论返回的是string.ModelAndView.View,最终都被解析成modelAndView 关键的实现代码是在springmvc.xml配置文件中定义解析器. 参考代码如下: < ...

  9. Xamarin Essentials教程使用指南针Compass

    Xamarin Essentials教程使用指南针Compass   指南针是一种确定地理方向的工具.在手机应用程序中,指南针通过手机的磁力计确定磁北极,提供手机方向信息.在Xamarin中,开发者可 ...

  10. 电脑用bat脚本给手机批量自动安装apk文件 autoInstall.bat

    ------创建这个文件autoInstall.bat 内容如下: @ECHO off @REM 将adb.exe添加到PATH中ECHO 初始化…@SET PATH=%PATH%;%CD%\Adb@ ...