首先要注意: <canvas> 元素不被一些老的浏览器所支持, 但被支持于Firefox 1.5+, Opera 9+, 新版本的Safari, Chrome, 以及Internet Explorer 9.

需要先获得2D渲染上下文才能绘制<canvas>元素

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

Canvas是基于状态绘制图像的。

基本使用:
1.使用下面两个方法就可以定义一个路径

context.moveTo(x,y); //起点
context.lineTo(x,y); //连线到终点

2.对于多个路径,如果想要分开处理,需要在路径定义的首尾加上下面两个方法,把他们分隔开

context.beginPath();
context.closePath();

3.路径样式

context.lineWidth    //定义线条宽度
context.strokeStyle //定义线条颜色
context.fillStyle //填充颜色 context.stroke(); //绘制线条
context.fill(); //绘制填充的颜色块

4.绘制弧线

context.arc(
centerx, centery, radius, //圆心坐标(x,y)以及半径r
startingAngle, endingAngle, //开始的弧度值,和结束的弧度值
anticlockwise = false //可选参数,(false顺时针绘制)还是(true逆时针绘制)
)

5.绘制矩形

context.rect(x, y, width, height); //设置矩形状态
context.fill();
context.stroke();
//或者
context.fillRect(x, y, width, height); //绘制填充的矩形
context.strokeRect(x, y, width, height); //绘制边框的矩形

6.fillStyle、strokeStyle的属性值的格式

#FFF
#333
rgb(255,128,0)
rgba(100,100,100,0.8)
hsl(20,62%,28%)
hsla(40,83%,33%,0.6)
red

7.线条的帽子:lineCap
用于设置线条两端的形状,有以下三种值:

butt(default)    //默认缺省
round //圆头
square //方头 context.lineCap = "round";

8.线条与线条相交的形态:lineJoin
   三种属性值:

miter(default)    //尖角
bevel //斜接
round //圆角 context.lineJoin = "round";
//当尖角很尖锐时,会出现lineJoin为bevel
//此时跟另外一个属性有关:miterLimit,默认值是10
//当在lineJoin为miter情况下,miterLimit大于10时,lineJoin会自动变成bevel

9.图像变换和状态保存
图像变换:

位移:translate(x,y);
旋转:rotate(deg);
缩放:scale(sx,sy); //保存当前图形状态:
context.save();
//恢复图形的所有状态:
context.restore();
//使用:
context.save();
context.translate(x,y);
context.restore();

10.变换矩阵

a    c    e
b d f
0 0 1
a水平缩放(1)
b水平倾斜(0)
c垂直倾斜(0)
d垂直缩放(1)
e水平位移(0)
f垂直位移(0)
即:默认时,该变换矩阵为单位阵 //设置变换矩阵
transform(a,b,c,d,e,f);
//重置变换矩阵
setTransform(a,b,c,d,e,f);

11.线性渐变

var grd = context.createLinearGradient(xstart,ystart,xend,yend);//开始坐标到结束坐标
grd.addColorStop(stop,color);//stop为浮点数,开始坐标点到结束坐标点直线上,某个位置(0.0~1.0之间)
//例:
var skyStyle = context.createLinearGradient(0,0,800,800);
skyStyle.addColorStop(0.0, 'black');
skyStyle.addColorStop(1.0, 'blue'); context.fillStyle = skyStyle;

12.径向渐变

var grd = context.createRadialGradient(x0,y0,r0,x1,y1,r1);//开始圆心坐标到结束圆心坐标,以及半径
grd.addColorStop(stop,color);//stop为浮点数,开始坐标点到结束坐标点直线上,某个位置(0.0~1.0之间)

13.图片填充

createPattern(img,repeat-style) //img为图片对象,repeat-style填充格式
//其中repeat-style: no-repeat/repeat-x/repeat-y/repeat
//例:
var backgroundImage = new Image();
backgroundImage.src = "bg.jpg";
backgroundImage.onload = function(){
var pattern = context.createPattern(backgroundImage,"repeat");
context.fillStyle = pattern;
context.fillRect(0,0,800,800);
}

14.canvas填充

createPattern(canvas,repeat-style) //canvas对象,repeat-style填充格式

例:

    window.onload=function(){
var canvas=document.getElementById("canvas");
canvas.width=800;
canvas.height=800;
var context=canvas.getContext("2d");
var backCanvas=createBackgroundCanvas();
var pattern=context.createPattern(backCanvas,"repeat");
context.fillStyle=pattern;
context.fillRect(0,0,800,800);
}
function createBackgroundCanvas(){
var backCanvas=document.createElement("canvas");
backCanvas.width=100;
backCanvas.height=100;
var backContext=backCanvas.getContext("2d");
backContext.beginPath();
backContext.moveTo(15,15);
backContext.lineTo(50,50);
backContext.lineWidth=10;
backContext.strokeStyle="green";
backContext.stroke();
return backCanvas;
}

15.video填充

createPattern(video,repeat-style) //video视频对象

16.另一种弧线绘制方法

context.arcTo(
x1,y1,x2,y2, //x1,y1,x2,y2两个坐标与起始点x0,y0组成一个角
radius //半径
)

例:

context.moveTo(x0,y0);
context.arcTo(x1,y1,x2,y2,R);
//起始点为(x0,y0),该弧线与01线以及12线相切

17.贝塞尔曲线
贝塞尔二次曲线

context.moveTo(x0, y0);    //起始点
context.quadraticCurveTo(
x1, y1, //控制点坐标
x2, y2 //终点坐标
)

参考:http://tinyurl.com/html5quadratic

贝塞尔三次曲线

context.moveTo(x0, y0);    //起始点
context.bezierCurveTo(
x1, y1, //控制点坐标
x2, y2, //控制点坐标
x3, y3 //终点坐标
)

参考:http://tinyurl.com/html5bezier

18.文字渲染

context.font = "font-style font-variant font-weight font-size font-family";    //css字体样式,默认值:"20px sans-serif"
context.fillText(String, x, y, [maxlen]); //String字符串,和坐标位置,第四个为可选参数,这行文字的最长宽度
context.strokeText(String, x, y, [maxlen]); font-style: normal (Default)
italics (斜体字)
oblique (倾斜字体) font-variant: normal (Default)
small-caps (小写英文字母变成小的大写字母) font-weight: normal (Default)
lighter
bold
bolder
100,200,300,400(normal)
500,600,700(bold)
800,900 font-size: 20px (Default)
2em
150% font-family: 设置多种字体备选,支持@font-face

文本水平对齐:

context.textAlign = left
right
center

文本垂直对齐:

context.textBaseline =  top
middle
bottom
alphabetic (Default)
ideographic
hanging

文本的度量:

context.measureText(String).width //获取渲染的字符串的宽度

19.阴影

context.shadowColor    //阴影颜色
context.shadowOffsetX //阴影的位移值
context.shadowOffsetY
context.shadowBlur //阴影模糊度

20.全局方法:

context.globalAlpha = 1 (Default)    //全局透明度,默认不透明

context.globalCompositeOperation = "source-over" (Default) //绘制的图像在重叠的时候的效果,默认是(source-over)后面绘制的图像覆盖前面绘制的图像
"source-atop" //后面绘制的图像覆盖前面绘制的图像,但后面的图像只显示重叠部分
"source-in" //后面绘制的图像覆盖前面绘制的图像,但只显示重叠部分
"source-out" //只显示后绘制的图像,而且重叠部分被切掉
"destination-over" //前面绘制的图像覆盖后面绘制的图像
"destination-atop" //前面绘制的图像覆盖后面绘制的图像,但前绘制的图像只显示重叠部分
"destination-in" //前面绘制的图像覆盖后面绘制的图像,但只显示重叠部分
"destination-out" //只显示前绘制的图像,而且重叠部分被切掉
"lighter" //重叠部分颜色叠加融合
"copy" //只显示后绘制图像
"xor" //异或,重叠部分被挖空

21.剪辑区域
将当前创建的路径设置为当前剪切路径的方法

void ctx.clip();
void ctx.clip(fillRule);
void ctx.clip(path, fillRule);

fillRule

这个算法判断一个点是在路径内还是在路径外。

path
需要剪切的 Path2D 路径。

例:

ctx.arc(100, 100, 75, 0, Math.PI*2, false);
ctx.clip();
ctx.fillRect(0, 0, 100,100);

22.非零环绕原则
路径方向
应用:镂空剪纸效果

23.canvas交互

context.clearRect(x,y,width,height) //清空指定的区域

context.isPointInPath(x,y) //点击检测函数,该点是否在当前规划路径内,当检测点包含在当前或指定的路径内,返回 true;否则返回 false

//以下两个是获取鼠标点击在canvas坐标
var x = event.clientX - canvas.getBoundingClientRect().left;
var y = event.clientY - canvas.getBoundingClientRect().top;

24.扩展Canvas的context
将drawStar方法扩展到context:

CanvasRenderingContext2D.prototype.drawStar = function(){}

25.Canvas兼容性
检测

<canvas id="canvas">当前浏览器不支持Canvas,请更换浏览器再试</canvas>

Canvas与IE6、7、8浏览器的兼容性问题

引入explorecanvas库:

https://code.google.com/p/explorecanvas/
<!--[if IE]><script type="text/javascript" src="../excanvas.js"></script><![endif]-->

26.canvas图形库:canvasplus || artisanJS || RGraph

http://code.google.com/p/canvasplus

http://artisanjs.com

http://roopons.com.au/wp-content/plugins/viral-optins/js/rgraph

27.Canvas 的 API 接口文档:

https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D

HTML5 Canvas 绘图的更多相关文章

  1. HTML5 Canvas绘图如何使用

    --------------复制而来--原地址http://jingyan.baidu.com/article/ed15cb1b2e642a1be369813e.html HTML5 Canvas绘图 ...

  2. HTML5 canvas绘图基本使用方法

    <canvas></canvas>是HTML5中新增的标签,用于绘制图形,实际上,这个标签和其他的标签一样,其特殊之处在于该标签可以获取一个CanvasRenderingCon ...

  3. HTML5 canvas绘图

    HTML5 canvas画图 示例 ------- <!DOCTYPE html> <head> <meta charset="UTF-8"> ...

  4. HTML5 Canvas绘图详解 drawImage() 方法 有图有真相!

    步骤 1 2 3 4 5   简介 是一个新的HTML元素,这个元素可以被Script语言(通常是JavaScript)用来绘制图形.例如可以用它来画图.合成图象.或做简单的(和不那么简单的)动画. ...

  5. HTML5 Canvas绘图基本使用方法, H5使用Canvas绘图

    Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的绘图功能(API),在网 ...

  6. HTML5 Canvas绘图系列之一:圆弧等基础图形的实现

    之前的一个微信项目已经要结项了,最近整理一下项目中使用较多的canvas画图方面的知识吧,打算写个3,4篇的样子.本篇主要介绍基础操作和弧线画法. 之后再写一下趋势图,直方图,文本图像处理的. 言归正 ...

  7. [html5] canvas 绘图:八卦图

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. HTML5 canvas 绘图步骤

    1.先把canvas选出来,不选出来你往哪儿画! var oCan=  document.getElementById('xxx'); 2.声明基于 canvas 的context对象,没他你怎么调用 ...

  9. HTML5 canvas绘图基础(电子名片生成器源码)

    创建canvas <canvas id="myCanvas" class="canvas"> 您的浏览器不支持canvas </canvas& ...

随机推荐

  1. SCNU 2015ACM新生赛初赛【1006. 3D打印】解题报告

            题目链接详见SCNU 2015新生网络赛 1006. 3D打印 .出题思路来自codevs 3288. 积木大赛,属于模拟题.         首先我们把“选择从第L部分到第R部分”理 ...

  2. MySQL高级特性

    MySQL管理 用户管理 CREATE USER username IDENTIFIED BY 'password'; 新建用户 CREATE USER@'%' IDENTIFIED BY 'pass ...

  3. jpa

    学习尚硅谷jpa笔记: 所依赖的jar包: 首先在META-INF下创建配置文件,persistence.xml <?xml version="1.0" encoding=& ...

  4. hadoopfs: 未找到命令...

    https://zhidao.baidu.com/question/240817305095236244.html 学习hadoop测试http://blog.csdn.net/thinkpadshi ...

  5. $.ajax()方法详解

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  6. PAT 1044. 火星数字(20)

    火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, no ...

  7. shiro-简介

    简介: Apache Shiro 是Java的一个安全(权限)框架. Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境. Shiro可以完成:认证 ...

  8. [LeetCode] Validate IP Address 验证IP地址

    In this problem, your job to write a function to check whether a input string is a valid IPv4 addres ...

  9. [LeetCode] Missing Number 丢失的数字

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  10. NPOI操作EXCEL(三)——反射机制进行excel表格数据的解析

    我们先来回忆回忆上篇文章讲到的通过xml配置文件实现excel批量模板解析的整体思路: 1.对每个excel模板制定xml配置规则集,实现xml配置文件的解析服务 2.为每个excel模板制定DTO, ...