第15章 使用Canvas绘图
基本用法
- 要使用canvas元素,必须先设置其width和height属性,指定绘图区域的大小。
- getContext():取得绘图上下文
- toDataURL():导出在canvas元素元素上绘制的图像
2D上下文
- 2D上下文的坐标开始于canvas元素的左上角,圆点坐标为(0,0),所有坐标都是基于这个圆点计算,x值越大越靠右,y值越大越靠下。
填充和描边
- 2D上下文的两种基本绘图操作是填充和描边
- fillStyle(填充)和strokeStyle(描边)属性:属性的值可以是字符串、渐变对象或模式对象
绘制矩形
方法名 | 参数 | 说明 |
---|---|---|
fillRect() | 矩形的x坐标、矩形的y坐标、矩形的宽度和矩形的高度 | 在画布上绘制的矩形会填充指定的颜色 |
strokeRect() | 矩形的x坐标、矩形的y坐标、矩形的宽度和矩形的高度 | 在画布上绘制的矩形会使用指定的颜色描边 |
clearRect() | 矩形的x坐标、矩形的y坐标、矩形的宽度和矩形的高度 | 清除画布上的矩形区域 |
1
2
3
4
5
6
7
8
9
10
11
12var drawing=document.getElementById("drawing");
//确定浏览器支持<canvas>元素
if(drawing.getContext) {
//取得绘图上下文对象的引用,“2d”是取得2D上下文对象
var context = drawing.getContext("2d");
//绘制红色矩形
context.fillStyle = "#ff0000";
context.fillRect(10,10,50,50);
//绘制半透明的蓝色矩形
context.fillStyle="rgba(0,0,255,0.5)";
context.fillRect(30,30,50,50);
}
1
2
3
4
5
6
7
8
9
10
11
12var drawing=document.getElementById("drawing");
//确定浏览器支持<canvas>元素
if(drawing.getContext) {
//取得绘图上下文对象的引用,“2d”是取得2D上下文对象
var context = drawing.getContext("2d");
//绘制红色矩形
context.strokeStyle = "#ff0000";
context.strokeRect(10,10,50,50);
//绘制半透明的蓝色矩形
context.strokeStyle="rgba(0,0,255,0.5)";
context.strokeRect(30,30,50,50);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14var drawing=document.getElementById("drawing");
//确定浏览器支持<canvas>元素
if(drawing.getContext) {
//取得绘图上下文对象的引用,“2d”是取得2D上下文对象
var context = drawing.getContext("2d");
//绘制红色矩形
context.fillStyle = "#ff0000";
context.fillRect(10,10,50,50);
//绘制半透明的蓝色矩形
context.fillStyle="rgba(0,0,255,0.5)";
context.fillRect(30,30,50,50);
//在两个矩形冲抵的地方清除一个小矩形
context.clearRect(40,40,10,10);
}
绘制路径
- 要绘制路径,首先必须调用beginPath()方法,表示要开始绘制新路径。
- strock()方法对路径描边。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22var drawing=document.getElementById("drawing");
//确定浏览器支持<canvas>元素
if(drawing.getContext){
//取得绘图上下文对象的引用,“2d”是取得2D上下文对象
var context=drawing.getContext("2d");
//开始路径
context.beginPath();
//绘制外圆
context.arc(100,100,99,0,2*Math.PI,false);
//绘制内圆
context.moveTo(194,100);
context.arc(100,100,94,0,2*Math.PI,false);
//绘制分针
context.moveTo(100,100);
context.lineTo(100,15);
//绘制时针
context.moveTo(100,100);
context.lineTo(35,100);
context.strokeStyle="rgba(0,0,255,0.5)";
//最后必须调用stroke()方法,这样才能把图像绘制到画布上。
context.stroke();
}
绘制文本
- fillText(),strokeText():接受四个参数:要绘制的文本,x坐标,y坐标和可选的最大像素
- fillText()由于可以模仿在网页中正常显示文本,所有应用的更多。
1
2
3
4
5//添加文字“12”
context.font="bold 14px Arial";
context.textAlign="center"; //文本的对齐方式
context.textBaseline="middle";//文本的基线
context.fillText("12",100,20);
变换
- save()、restore()可以跟踪上下文的状态变化
- save保存设置到一个栈结构,restore恢复前一级保存的状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var context=drawing.getContext("2d");
context.fillStyle="#ff0000";
context.save();
context.fillStyle="#00ff00";
context.translate(100,100);
context.save();
context.fillStyle="#0000ff";//蓝色
context.fillRect(0,0,100,200); //点(110,110)
context.restore();//绿色
context.fillRect(10,10,100,200); //点(110,110)
context.restore();//红色
context.fillRect(0,0,100,200); //点(0,0)
绘制图像
- drawImage():把一幅图像绘制到画布上。
- 三种不同的调用方式:
1.传入一个元素,绘制图像起点的x,y坐标。
2.还可以再传两个参数:目标宽度,目标高度。以此来缩放图像。
3.传入9个参数:要绘制的图像,源图像的x坐标,源图像的y坐标,源图像的宽度,源图像的高度,目标图像的x坐标,目标图像的y坐标,目标图像的宽度,目标图像的高度。
阴影
- shadowColor:用Css颜色格式表示的阴影颜色,默认为黑色。
- shadowOffsetX:形状或路径x轴的阴影偏移量,默认为0.
- shadowOffsetY:形状或路径ya轴的阴影偏移量,默认为0.
- shadowBlur:模糊的像素数,默认为0,及不模糊。
渐变
- 渐变由CanvasGradient实例表示。通过2D上下文来创建和修改:
- createLinearGradient():创建一个新的线性渐变。4个参数:起点的x,y坐标,终点的x,y坐标。返回CanvasGradient实例。
- 创建完后,使用addColorStop():指定色标。两个参数:色标位置(0-1)和CSS颜色值。
1 | var context = drawing.getContext("2d"), |
模式
- 其实就是重复的图像,可以用来填充或描边图形。
- createPattern():2个参数,一个HTML
<img>
元素和一个表示如何重复图像的字符串
使用图像数据
- getImageData():取得原始图像数据。4个参数,要取得其数据的画面区域的x,y坐标以及该区域的像素宽度和高度。 返回一个ImageData的实例。
- 每个ImageData对象有三个属性。width,height和data。
- data属性是一个数组,保存着图像中每个像素的数据,每个像素用4个元素保存,红,绿,蓝,透明度
合成
- globalAlpah:介于0-1的值,用于指定所有绘制的透明度。
- globalCompositionOperation:表示后绘制的图形怎样与先绘制的结合
WebGL
- 针对Canvas的3D上下文
类型化数组
- 类型化数组也是数组,只不过其元素被设置为特性类型的值
- ArrayBuffer(数组缓冲器类型):表示内存中指定的字节数,但是不会指定这些字节用于保存什么类型的数据
WebGL上下文
- 用GLSL编写的顶点和片段着色器
- 支持类型化数组,即能够将数组中的数据限定为某种特定的数据类型
- 创建和操作纹理