当前位置: 首页 > 编程日记 > 正文

HTML5 canvas画图

HTML5 canvas画图

HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript)。
不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务。
getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
本手册提供完整的 getContext("2d") 对象属性和方法,可用于在画布上绘制文本、线条、矩形、圆形等等。

浏览器支持
Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。

一.画图

现实生活中,画图需要考虑:

画布

1.线条的粗细;

2.线条的颜色;

3.线条的虚实;

画线

1.起点;

2.终点;

画圆

1.圆点;

2.半径;

3.实心、空心

画矩形

1.矩形的左上起点;

2.矩形的长、宽;

文本

1.字体样式;

2.实心、空心;

添加图片等

二.画图API

根据画图需要,canvas有以下API

canvas主要属性和方法

方法描述
save()保存当前环境的状态
restore()返回之前保存过的路径状态和属性
createEvent()
getContext()返回一个对象,指出访问绘图功能必要的API
toDataURL()返回canvas图像的URL

canvasAPI颜色、样式和阴影属性和方法

属性描述
fillStyle设置或返回用于填充绘画的颜色、渐变或模式
strokeStyle设置或返回用于笔触的颜色、渐变或模式
shadowColor设置或返回用于阴影的颜色
shadowBlur设置或返回用于阴影的模糊级别
shadowOffsetX设置或返回阴影距形状的水平距离
shadowOffsetY设置或返回阴影距形状的垂直距离

方法描述
createLinearGradient()创建线性渐变(用在画布内容上)
createPattern()在指定的方向上重复指定的元素
createRadialGradient()创建放射状/环形的渐变(用在画布内容上)
addColorStop()规定渐变对象中的颜色和停止位置

Canvas的API-线条样式属性和方法

属性描述
lineCap设置或返回线条的结束端点样式
lineJoin设置或返回两条线相交时,所创建的拐角类型
lineWidth设置或返回当前的线条宽度
miterLimit设置或返回最大斜接长度

Canvas的API-矩形方法

方法描述
rect()创建矩形
fillRect()绘制"被填充"的矩形
strokeRect()绘制矩形(无填充)
clearRect()在给定的矩形内清除指定的像素

Canvas的API-路径方法

方法描述
fill()填充当前绘图(路径)
stroke()绘制已定义的路径
beginPath()起始一条路径,或重置当前路径
moveTo()把路径移动到画布中的指定点,不创建线条
closePath()创建从当前点回到起始点的路径
lineTo()添加一个新点,创建从该点到最后指定点的线条
clip()从原始画布剪切任意形状和尺寸的区域
quadraticCurveTo()创建二次贝塞尔曲线
bezierCurveTo()创建三次方贝塞尔曲线
arc()创建弧/曲线(用于创建圆形或部分圆)
arcTo()创建两切线之间的弧/曲线
isPointInPath()如果指定的点位于当前路径中,返回布尔值

Canvas的API-转换方法

方法描述
scale()缩放当前绘图至更大或更小
rotate()旋转当前绘图
translate()重新映射画布上的 (0,0) 位置
transform()替换绘图的当前转换矩阵
setTransform()将当前转换重置为单位矩阵。然后运行 transform()

Canvas的API-文本属性和方法

属性描述
font设置或返回文本内容的当前字体属性
textAlign设置或返回文本内容的当前对齐方式
textBaseline设置或返回在绘制文本时使用的当前文本基线

方法描述
fillText()在画布上绘制"被填充的"文本
strokeText()在画布上绘制文本(无填充)
measureText()返回包含指定文本宽度的对象

Canvas的API-图像绘制方法

方法描述
drawImage()向画布上绘制图像、画布或视频  chrome不支持

Canvas的API-像素操作方法和属性

属性描述
width返回 ImageData 对象的宽度
height返回 ImageData 对象的高度
data返回一个对象,其包含指定的 ImageData 对象的图像数据

方法描述
createImageData()创建新的、空白的 ImageData 对象
getImageData()返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
putImageData()把图像数据(从指定的 ImageData 对象)放回画布上

Canvas的API-图像合成属性

属性描述
globalAlpha设置或返回绘图的当前 alpha 或透明值
globalCompositeOperation设置或返回新图像如何绘制到已有的图像上

三.canvas简单画图

3.1canvas API练习

<!doctype html>
<html><head></head><body><canvas width="500" height="800" style="background:yellow"  id="canvas">您的浏览器当前版本不支持canvas标签</canvas><script>//获取画布DOM  还不可以操作var canvas=document.getElementById('canvas');//alert(canvas);//设置绘图环境var cxt=canvas.getContext('2d');//alert(cxt);//画一条线段。//开启新路径
                cxt.beginPath();//设定画笔的宽度
                cxt.lineWidth=10;//设置画笔的颜色
                cxt.strokeStyle="#ff9900";//设定笔触的位置
                cxt.moveTo(20,20);//设置移动的方式
                cxt.lineTo(100,20);//画线
                cxt.stroke();//封闭路径
                cxt.closePath();//画一个空心圆形  凡是路径图形必须先开始路径,画完图之后必须结束路径//开始新路径
                cxt.beginPath();//重新设置画笔
                cxt.lineWidth=3;cxt.strokeStyle="green";cxt.arc(200,200,50,0,360,false);cxt.stroke();//封闭新路径
                cxt.closePath();//画一个实心圆形
                cxt.beginPath();//设置填充的颜色
                cxt.fillStyle="rgb(255,0,0)";cxt.arc(200,100,50,0,360,false);cxt.fill();cxt.stroke();cxt.closePath();//画一个矩形
                cxt.beginPath();cxt.rect(300,20,100,100);cxt.stroke();cxt.closePath();//其他方法 建议使用此方式
                cxt.strokeRect(300,150,100,100)//实心矩形
                cxt.beginPath();cxt.rect(300,270,100,100);cxt.fill();cxt.closePath();//其他方法 建议使用此方式
                cxt.fillRect(300,390,100,100);//设置文字
                cxt.font="40px 宋体";//css font属性
                cxt.fillText("jingwhale",20,300);//将笔触设置为1像素
                cxt.lineWidth=1;cxt.strokeText("jingwhale",20,350);//画图 把一幅图片画到画布中  注意webkit内核的浏览器 chrome和猎豹不支持var img =new Image();img.src="xiaomm.jpg";cxt.drawImage(img,20,370,230,306);//画一个三角形
                cxt.beginPath();//移动至开始点
                cxt.moveTo(300,500);cxt.lineTo(300,600);cxt.lineTo(400,550);cxt.closePath();//填充或者画路径需要先闭合路径再画
                cxt.stroke();//实心三角形
                cxt.beginPath();//移动至开始点
                cxt.moveTo(300,600);cxt.lineTo(300,700);cxt.lineTo(400,650);cxt.closePath();cxt.fill();//旋转图片 图片//设置旋转环境
                cxt.save();//在异次元空间重置0,0点的位置
                    cxt.translate(20,20);//图片/形状旋转//设置旋转角度  参数是弧度  角度 0-360 弧度=角度*Math.PI/180
                    cxt.rotate(-30*Math.PI/180);//旋转一个线段
                    cxt.lineWidth=10;cxt.beginPath();cxt.moveTo(0,0);cxt.lineTo(20,100);cxt.stroke();cxt.closePath();//将旋转之后的元素放回原画布
                cxt.restore();//过程不可颠倒 先设置00点在旋转角度,然后画图//旋转图片
                cxt.save();cxt.translate(20,370);cxt.rotate(-10*Math.PI/180);var img =new Image();img.src="xiaomm.jpg";cxt.drawImage(img,0,0,230,306);cxt.restore();            </script></body>
</html>
See the Pen qOmXGm by jingwhale (@jingwhale) on CodePen.

3.2画图流程

1.设置、获取画布DOM;

2.设置绘图环境
  var cxt=canvas.getContext('2d');
3.开启新路径

cxt.beginPath();

4.设定画笔的宽度
cxt.lineWidth=10;
5.设置画笔的颜色
cxt.strokeStyle="#ff9900";

6.依据API画图

7.封闭路径
cxt.closePath();

3.3canvas 作业-星球运转

See the Pen yYbzYN by jingwhale (@jingwhale) on CodePen.
//获取canvas绘图环境var context = document.getElementById('canvas').getContext('2d');var time = 0;//星球轨道function drawTrack(){for(var i = 0; i < 8; i++){//开始路径
                    context.beginPath();context.arc(500,500,(i+1)*50,0,360,false);//关闭路径
                    context.closePath();context.strokeStyle = '#fff';context.stroke();}}//执行以下此函数,画出各星球的轨道
            drawTrack();//星球  星球对象的构造方法 实例化后能画出所有的星球function Star(x,y,radius,sColor,eColor,cycle){//星球需要的哪些属性//星球的坐标点this.x = x;this.y = y;//星球的半径this.radius = radius;//星球的颜色this.sColor = sColor;this.eColor = eColor;//公转周期this.cycle = cycle;//绘画出星球this.draw = function(){  //异次元空间进行绘画
                    context.save();//重设0,0坐标点context.translate(500,500);//设置旋转角度context.rotate(time*360/this.cycle*Math.PI/180);context.beginPath();context.arc(this.x,this.y,this.radius,0,360,false);context.closePath();//星球的填充色(径向渐变 开始色和结束色)this.color = context.createRadialGradient(this.x,this.y,0,this.x,this.y,this.radius);this.color.addColorStop(0,this.sColor);this.color.addColorStop(1,this.eColor);context.fillStyle = this.color;context.fill();context.restore();time +=1;}}//各星球构造方法 从star中继承function Sun(){Star.call(this,0,0,20,'#f00','#f90',0);}function Mercury(){Star.call(this,0,-50,10,'#A69697','#5C3E40',87.70);}function Venus(){Star.call(this,0,-100,10,'#C4BBAC','#1F1315',224.701);}function Earth(){Star.call(this,0,-150,10,'#78B1E8','#050C12',365.2422);}function Mars(){Star.call(this,0,-200,10,'#CEC9B6','#76422D',686.98);}function Jupiter(){Star.call(this,0,-250,10,'#C0A48E','#322222',4332.589);}function Saturn(){Star.call(this,0,-300,10,'#F7F9E3','#5C4533',10759.5);}function Uranus(){Star.call(this,0,-350,10,'#A7E1E5','#19243A',30799.095);}function Neptune(){Star.call(this,0,-400,10,'#0661B2','#1E3B73',164.8*365);}//各星球对象的实例化var sun = new Sun();var water = new Mercury();var gold = new Venus();var diqiu = new Earth();var fire = new Mars();var wood = new Jupiter();var soil = new Saturn();var sky = new Uranus();var sea = new Neptune();function move(){//清除画布context.clearRect(0,0,1000,1000);//重新绘制一遍轨道
                drawTrack();sun.draw();water.draw();gold.draw();diqiu.draw();fire.draw();wood.draw();soil.draw();sky.draw();sea.draw();}//星球围绕太阳运动起来setInterval(move,100);

演示

四.canvas画图实例-网页画图

源代码:https://github.com/jingwhale/online-canvas

image

1.画图板功能分析

功能区(保存、清空)
工具区(形状和工具)
属性设置区(颜色和线宽)
绘图区域(canvas标签)

2.技术需求分析

页面布局->HTML5标签
页面美化->CSS2
功能设置->Javascript编程
Canvas API->属性设置、画线、写字、画图、画布操作(清空、获取画布信息)、
下载->php的下载(JS无法操作本地文件)

3.画一个简单的画布

鼠标点击时
准备起始点 moveTo()、设置标志位
鼠标移动时
判断标志位,值为true画图,false不画图
移动时指定路径lineTo(),并且画出来stroke()
鼠标离开或者抬
清空标志位

4.复杂的在线画板

获取相应元素对象
设置点击状态
设置触发功能
颜色属性设置
线宽属性设置
绘图形状设置
工具指定

5.html结构部分:

clipboard

ef182ccb5078489aa075a2e8e88c1b64

6.画图技术点:

整个画图被鼠标事件所控制


鼠标按下的事件-》mousedown
鼠标移动的事件-》mousemove
鼠标抬起事件-》mouseup

//鼠标按下的时候-》设置开始点
canvas.οnmοusedοwn=function(evt){
//鼠标移动的时候-》不同的绘图(获取鼠标的位置)
canvas.οnmοusemοve=function(evt){}
//鼠标抬起的时候结束绘图
canvas.οnmοuseup=function(){

演示:

附:HTML5 - 塔防游戏

-------------------------------------------------------------------------------------------------------------------------------------

转载需注明转载字样,标注原作者和原博文地址。

更多阅读:

http://www.w3school.com.cn/tags/html_ref_canvas.asp

转载于:https://www.cnblogs.com/jingwhale/p/4857936.html

相关文章:

排序算法7---快速排序算法

原理&#xff1a; 通过一趟排序将待排记录分割成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分记录的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序的目的。 #include <stdio.h> #define MAXSIZE 9typedef stru…

dispatch callback ant design pro 网络请求回调函数

index.jsx 代码解析:在组件初次渲染时调用 model 中 命名空间为 a_models 的 getData 网络请求,传了一个patload 参数和 callback 回调函数过去,然后通过 this.setState ()更新视图的 state。 import { Form, Tabs,Affix, Button,Input,Table } from antd; import Re…

bigquery使用教程_如何使用Python和Google BigQuery构建机器人以自动执行您的笨拙任务...

bigquery使用教程Do you have repetitive tasks? Something that you do regularly, every week or even every day? Reporting might be one of your weekly or daily tasks. You query or ask for the data, and do some visualizations, then give it to your boss. What …

5S后返回首页

1 <!DOCTYPE html>2 <html>3 <head>4 <title>5S后返回首页</title> 5 <meta http-equiv"Content-Type" content"text/html; charsetgkb"/> 6 </head>7 <body>8 <h2>操作成功</h2>…

TypeScript 1

TypeScript 的由来 TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大型应用&#xff0c;它可以编译成纯 JavaScript&#xff0c;编译出来的 JavaScript 可以运行在任何…

大龄屌丝自学笔记--Java零基础到菜鸟--028

泛型&#xff0c;for循环增强应用&#xff0c;静态导入&#xff0c;可变参数&#xff0c;asList() 1、泛型 约束了数据类型&#xff0c;格式为 <数据类型>&#xff0c;如&#xff1a;ArrayList<int> aListnew ArrayList<int>(); 泛型通配符&#xff1a;<?…

c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法

c# typescriptby Leonardo Carreiro莱昂纳多卡雷罗(Leonardo Carreiro) 在任何IDE中从C&#xff03;&#xff0c;Java或Python代码获取TypeScript接口的简单方法 (The easy way to get TypeScript interfaces from C#, Java, or Python code in any IDE) Who has never experi…

js里的document对象大全(DOM操作)

什么是DOM document object model 的简称&#xff0c;意思为文档对象模型。主要用来对文档中的html节点进行操作。 Dom的操作简单示例&#xff1a; <div id"t1"><div><input type"file" /> <input type"button" value"…

【制作镜像】BCEC制作镜像

如要制作的新镜像已存在标准版本镜像&#xff0c;即linux发行版本相同&#xff08;此处指CentOS6.5 64位&#xff09;&#xff0c;可利用BCEC制作。 在BCEC创建centos6.5系统的可联外网的虚机&#xff0c;ssh到此虚机&#xff0c;用yum方式安装所需的功能&#xff1a; yum&…

Ant Design Pro 组件事件绑定 Input onChange

Input 组件的 onChange 事件绑定语法 render() {this.shop_change e > {const { value } e.target;console.log(shop_change,value)};return (<Input placeholder"" onChange{this.shop_change}></Input>)}

软件访问转向本地_我是如何从完整的初学者转向软件开发人员的,以及如何做到的...

软件访问转向本地by Madison Kanna麦迪逊卡纳(Madison Kanna) 我是如何从完整的初学者转向软件开发人员的&#xff0c;以及如何做到的 (How I went from complete beginner to software developer — and how you can too) Two years ago, I was right where you are today.两…

.NET笔试题集(五)

转载于&#xff1a;http://www.cnblogs.com/ForEvErNoME/archive/2012/09/15/2684938.html 1.什么是受管制的代码&#xff1f; 答&#xff1a;unsafe&#xff1a;非托管代码。不经过CLR运行。 2.net Remoting 的工作原理是什么&#xff1f; 答&#xff1a;服务器端向客户端发送…

devServer proxy跨域 设置代理 proxy

概念 什么是同源策略 同源策略是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的&#xff0c;浏览器只是针对同源策略的一种实现。 所谓同源是指…

转帖 开源游戏服务器调研

汇总贴 2013年优秀的开源引擎与开源游戏项目 http://mobile.51cto.com/aengine-431122.htm http://www.oschina.net/search?scopeproject&q%E6%89%8B%E6%B8%B8 当前的几种开源游戏服务端介绍 http://www.oschina.net/question/1986738_224669 用户贴&#xff0c;使用过后…

websockets_如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序

websocketsby Janitha Tennakoon通过詹妮莎特纳库恩 如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序 (How to build real-time applications using WebSockets with AWS API Gateway and Lambda) Recently AWS has announced the launch of a widely-r…

JS对象转URL参数

代码&#xff1a; /*** param 将要转为URL参数字符串的对象* key URL参数字符串的前缀* encode true/false 是否进行URL编码,默认为true* idx ,循环第几次&#xff0c;用&拼接* return URL参数字符串*/ var urlEncode (param,idx, key, encode)> {console.log(idx,idx…

Windows下Redis如何永久更改密码

公司使用的是Spring-session-redis 需要给Redis配置一个密码 本来我配置密码的方法是 先打开Redis服务 在采用 命令 CONFIG SET requirepass "密码" AUTH 密码 但是这样配置完密码之后再重启Redis服务密码会重置 也就是说每次打开Redis服务都要重新再配置一下密码 …

CEGUI-----动画

Animation XML files. <AnimationDefinition> <Affector name‘要被改变的属性名’ interpolator‘关键帧之间平滑过度的数值’> //specifies the name of a property that will be affected (have its value changed) as part of the animation <KeyFrame>…

react hooks使用_如何使用Hooks将React类组件转换为功能组件

react hooks使用by Balaganesh Damodaran通过Balaganesh Damodaran 如何使用Hooks将React类组件转换为功能组件 (How to convert React class components to function components using Hooks) Over the course of the past month, I’ve spent a lot of time working with Re…

[精]Odoo 8.0深入浅出开发教程-模块开发基础

參考资料点击这里.构建Odoo模块模块组成业务对象业务对象声明为Python类, 由Odoo自己主动加载.数据文件XML或CSV文件格式, 在当中声明了元数据(视图或工作流)、配置数据(模块參数)、演示数据等.Web控制器处理Web浏览器发来的requests.静态web数据Web用到的图像, CSS或JavaScrip…

Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)...

1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求&#xff1a;把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 数据源&#xff1a; a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader 目的地&#xff1a;…

Ant Design Pro 跳转路由 传参数,接收参数

umi/link 通过声明的方式做路由跳转。 例子: import Link from umi/link;export default () => {<div>/* 普通使用 */<Link to="/list">Go to list page</Link>/* 带参数 */<Link to="/list?a=b">Go to list page</Lin…

编写react组件_React组件的“黄金法则”如何帮助您编写更好的代码

编写react组件以及钩子如何发挥作用 (And how hooks come into play) Recently I’ve adopted a new philosophy that changes the way I make components. It’s not necessarily a new idea but rather a subtle new way of thinking.最近&#xff0c;我采用了一种新的理念&a…

js验证函数摘录

/**本文摘自&#xff1a;http://www.cnblogs.com/rob0121/articles/1776298.html* js各种表单数据验证*/ /**************************************************************************************/ /*************************************数字的验证*********************…

React for循环渲染组件

通常你需要在一个组件中渲染列表。或者循环遍历渲染相同的多个组件,下面看看怎么实现: render() {const options = this.state.data.map(d => <Option key={d.value}>{d.text}</Option>);return (<SelectshowSearchvalue={this.state.value}placeholder={t…

让电脑的灵魂跟你走

想必我这个题目一出来&#xff0c;大家就知道我想写的是电脑远程控制了。 电脑远程控制是为了方便人们随时随地访问自己的电脑&#xff0c;从而进行更加灵活高效的工作。最常见的远程控制是我们利用客户端直接进入后台操作命令行界面。也就是终端shell。 电影里面&#xff0c;黑…

您尝试打开的文件_您是否尝试过重新打开软件团队的身份?

您尝试打开的文件by Victoriya Kalmanovich由Victoriya Kalmanovich 您是否尝试过重新打开软件团队的身份&#xff1f; (Have you tried turning your software team’s identity off and on again?) This series portrays my experience as an R&D group leader of a gr…

vijos 1006 晴天小猪历险记之Hill——数字三角形的终极变化

题目链接&#xff1a;https://vijos.org/p/1006 数字三角形原题看这里&#xff1a;http://www.cnblogs.com/huashanqingzhu/p/7326837.html 背景 在很久很久以前&#xff0c;有一个动物村庄&#xff0c;那里是猪的乐园&#xff08;^_^&#xff09;&#xff0c;村民们勤劳、勇敢…

电磁学讲义6:高斯定理计算电场

高斯定理是电场力平方反比定律和线性叠加原理的直接结果。也可以由高斯定理作为基本规律导出库仑定律。这说明高斯定理和库仑定律是不同形式的表示电荷和电场关系的同一规律。库仑定律可以使我们从电荷分布求出电场分布&#xff0c;高斯定理可以使我们从电场分布求出电荷分布。…

ant table表格整行点击事件并获取当前行的数据

实现效果:点击表格中某一行,或者点击表格中某一行的一个字段,获取当前行的 item 下标数据,并用 Link 标签传参,下一个页面接收的实现。 如果使用 router 跳转路由传参,需要导入 import router from umi/router; 如果用 Link 跳转路由传参,需要导入 import Link from u…