介绍
通过脚本(JavaScript),用于图形的绘制,<canvas> 标签相当于一个图形容器 / 画布。
绘图
1、创建一个画布
<canvas id="myCanvas" width="200" height="100">您的浏览器不支持 HTML5 canvas 标签</canvas>
注意:
1、 默认情况下 <canvas> 元素没有边框和内容。
2、可以在HTML页面中使用多个 <canvas> 元素。
2、使用 JavaScript 来绘制图像
canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成:
.html
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
.js
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "#FF0000";
ctx.fillRect(0,0,150,75);
效果如下:
Canvas 坐标
canvas 的左上角坐标为 (0,0)
Canvas 路径
在Canvas上画线,首先定义开始和结束坐标,然后绘制
-
moveTo(x,y)
: 定义线条开始坐标 -
lineTo(x,y)
: 定义线条结束坐标 -
stroke()
:绘制
示例:
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.moveTo(0,0);
ctx.lineTo(200,100);
ctx.stroke();
Canvas 绘制圆形
使用以下方法:
arc(x,y,r,start,stop)
-
beginPath();
:开始绘制圆 -
arc(x,y,r,start,stop)
: 圆的信息:圆心(x,y)、半径r、开始位置start、结束为止stop -
stroke()
:绘制
示例:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.beginPath();
ctx.arc(95,50,40,0,2*Math.PI);
ctx.stroke();
绘制文本
使用的属性和方法如下:
-
font
- 定义字体 -
fillText(text,x,y)
- 在 canvas 上绘制实心的文本 -
strokeText(text,x,y)
- 在 canvas 上绘制空心的文本
示例:
cv_ctx.font = "30px Arial";
// cv_ctx.fillText("Hello World",10,50);
cv_ctx.strokeText("Hello World",10,50);
绘制渐变色
渐变可以填充在矩形, 圆形, 线条, 文本等等, 各种形状可以自己定义不同的颜色。
两中设置Canvas渐变的方法:
-
createLinearGradient(x,y,x1,y1)
:创建线条渐变 -
createRadialGradient(x,y,r,x1,y1,r1)
:创建一个径向/圆渐变
示例1:线条渐变
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
// 创建线条渐变
var grd=ctx.createLinearGradient(0,0,200,0);
grd.addColorStop(0,"red");
grd.addColorStop(1,"white");
// 填充渐变
ctx.fillStyle = grd;
ctx.fillRect(10,10,150,80);
addColorStop(0,"red")
:规定渐变对象中的颜色和停止位置。
第一个参数值的范围是 0 ~ 1,表示颜色渐变偏区域的移量。
示例2:圆形、径向渐变
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
// 创建渐变
var grd=ctx.createRadialGradient(100,100,10,100,100,50);
grd.addColorStop(0,"red");
grd.addColorStop(1,"yellow");
// 填充渐变
ctx.fillStyle=grd;
ctx.fillRect(10,10,150,80);
createRadialGradient(100,100,10,100,100,50)
参数解释
- 100,100,10)是第一个圆,(100,100,50 )是第二个圆。
- 10 ~ 50 的半径之间的区域 是颜色渐变的区域。
绘制图像
把一幅Image放置到画布上, 使用以下方法:
drawImage(image,x,y)
示例:
var cv = document.getElementById("hb1");
var cv_ctx = cv.getContext("2d");
var imgs = document.getElementById("img1");
imgs.onload = function(){
cv_ctx.drawImage(imgs,0,0);
}
方法补充介绍
颜色、样式、阴影
属性 | 描述 |
---|---|
fillStyle | 设置或返回用于 填充绘画 的颜色、渐变或模式。 |
strokeStyle | 设置或返回用于 笔触 的颜色、渐变或模式。 |
shadowColor | 设置或返回用于阴影的颜色。 |
shadowBlur | 设置或返回用于阴影的模糊级别。 |
shadowOffsetX | 设置或返回阴影与形状的水平距离。 |
shadowOffsetY | 设置或返回阴影与形状的垂直距离。 |
方法 | 描述 |
---|---|
createLinearGradient() | 创建 线性渐变(用在画布内容上)。 |
createPattern() | 在 指定的方向上重复指定的元素。 |
createRadialGradient() | 创建 放射状/环形 的渐变(用在画布内容上)。 |
addColorStop() | 规定渐变对象中的 颜色、停止位置、偏移量。 |
-
fillStyle
、strokeStyle
属性值
context.fillStyle = color | gradient | pattern;
context.strokeStyle = color | gradient | pattern;
值 | 描述 |
---|---|
color | 指示绘图填充色的 CSS 颜色值。默认值是 #000000。 |
gradient | 用于填充绘图的渐变对象(线性 或 放射性)。 |
pattern | 用于填充绘图的 pattern 对象。 |
fillStyle示例:定义用红色填充的矩形:
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.fillStyle="#FF0000";
ctx.fillRect(20,20,150,100);
效果:
strokeStyle示例:绘制一个矩形。使用渐变笔触:
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var gradient=ctx.createLinearGradient(0,0,170,0);
gradient.addColorStop("0","magenta");
gradient.addColorStop("0.5","blue");
gradient.addColorStop("1.0","red");
ctx.strokeStyle=gradient;
ctx.lineWidth=5;
ctx.strokeRect(20,20,150,100);
效果:
-
shadowColor
、shadowBlur
、shadowOffsetX
、shadowOffsetY
阴影属性的值
属性 | 值 | 描述 |
---|---|---|
shadowColor |
color | 用于阴影的 CSS 颜色值。默认值是 #000000。 |
shadowBlur |
number | 阴影的模糊级数 |
shadowOffsetX |
number | 正值或负值,定义阴影与形状的水平距离。 |
shadowOffsetY |
number | 正值或负值,定义阴影与形状的垂直距离。 |
示例:
cv_ctx.fillStyle = "red";
cv_ctx.shadowColor = "black";
cv_ctx.shadowBlur = 10;
cv_ctx.shadowOffsetX = 10;
cv_ctx.shadowOffsetY = 10;
cv_ctx.fillRect(20,20,50,50);
效果:
createLinearGradient()
语法:context.createLinearGradient(x0,y0,x1,y1);
参数 | 描述 |
---|---|
x0、y0 | 渐变开始点 |
x1、y1 | 渐变结束点 |
createRadialGradient()
语法:context.createRadialGradient(x0,y0,r0,x1,y1,r1);
参数 | 描述 |
---|---|
x0、y0、r0 | 第一个圆的圆点、半径 |
x1、y1、r1 | 第二个圆的圆点、半径 |
注意:渐变的区域是 r0 ~ r1之间
createPattern()
语法:context.createPattern(image,"repeat | repeat-x | repeat-y | no-repeat");
参数 | 描述 | |
---|---|---|
image | 规定要使用的模式的图片、画布或视频元素。 | |
repeat | 默认。该模式在水平和垂直方向重复。 | |
repeat-x | 该模式只在水平方向重复。 | |
repeat-y | 该模式只在垂直方向重复。 | |
no-repeat | 该模式只显示一次(不重复)。 |
线条样式
属性 | 描述 |
---|---|
lineCap | 设置或返回 线条的结束端点样式。 |
lineJoin | 设置或返回 两条线相交时,所创建的拐角类型。 |
lineWidth | 设置或返回 当前的线条宽度。 |
miterLimit | 设置或返回 最大斜接长度。 |
lineCap
语法: context.lineCap="butt | round | square";
值 | 描述 |
---|---|
butt | 默认。向线条的每个末端添加平直的边缘。 |
round | 向线条的每个末端添加圆形线帽。 |
square | 向线条的每个末端添加正方形线帽。 |
lineJoin
语法: context.lineJoin="bevel|round|miter";
值 | 描述 |
---|---|
bevel | 创建斜角。 |
round | 创建圆角。 |
miter | 默认。创建尖角。 |
miterLimit
语法: context.miterLimit=number;
值 | 描述 |
---|---|
number | 正数。规定最大斜接长度。 |
斜接长度指的是在两条线交汇处内角和外角之间的距离:
- 如果斜接长度超过 miterLimit 的值,边角会以 lineJoin 的 "bevel" 类型来显示。
- 只有当 lineJoin 属性为 "miter" 时,miterLimit 才有效。
矩形
方法 | 描述 |
---|---|
rect(x, y, width, height) | 创建矩形。 |
fillRect(x , y, width, height) | 绘制"被填充"的矩形。 |
strokeRect(x , y, width, height) | 绘制矩形(无填充)。 |
clearRect(x , y, width, height) | 在给定的矩形内清除指定的像素。 |
rect(x, y, width, height)
语法: context.rect(x,y,width,height);
创建矩形。
fillRect(x , y, width, height)
语法: context.fillRect(x,y,width,height);
绘制"已填充"的矩形。默认的填充颜色是黑色。
strokeRect(x,y,width,height)
语法: context.strokeRect(x,y,width,height);
绘制矩形(无填充)。笔触的默认颜色是黑色。
clearRect(x,y,width,height)
语法: context.clearRect(x,y,width,height);
清空给定矩形内的指定像素。
路径
方法 | 描述 |
---|---|
fill() | 填充当前绘图(路径)。 |
stroke() | 绘制已定义的路径。 |
beginPath() | 起始一条路径,或重置当前路径。 |
closePath() | 创建从当前点回到起始点的路径。 |
moveTo(x, y) | 把路径移动到画布中的指定点,不创建线条。 |
lineTo(x, y) | 添加一个新点,然后在画布中创建从该点到最后指定点的线条。 |
clip() | 从原始画布剪切任意形状和尺寸的区域。 |
quadraticCurveTo(cpx, cpy, x, y) | 创建二次贝塞尔曲线。 |
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) | 创建三次贝塞尔曲线。 |
arc(x, y, r, sAngle, eAngle, counterclockwise?) | 创建弧/曲线(用于创建圆形或部分圆)。 |
arcTo(x1, y1, x2, y2, r) | 创建两切线之间的弧/曲线。 |
isPointInPath(x, y) | 如果指定的点位于当前路径中,则返回 true,否则返回 false。 |
fill()
语法: context.fill();
填充当前的图像(路径)。默认颜色是黑色。
stroke()
语法: context.stroke();
绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色。
-
moveTo(x, y)
、lineTo(x, y)
语法: context.moveTo(x,y);
语法: context.lineTo(x,y);
示例:
ctx.moveTo(0,0);
ctx.lineTo(300,150);
ctx.stroke();
beginPath()
语法: context.beginPath();
开始一条路径,或重置当前的路径。以达到绘制多个图形。
ctx.beginPath();
ctx.moveTo(0,75);
ctx.lineTo(250,75);
ctx.stroke(); // Draw it
ctx.beginPath();
ctx.moveTo(50,0);
ctx.lineTo(150,130);
ctx.stroke(); // Draw it
closePath()
语法: context.closePath();
创建从当前点到开始点的路径。
示例:
ctx.beginPath();
ctx.moveTo(20,20);
ctx.lineTo(20,100);
ctx.lineTo(70,100);
ctx.closePath();
ctx.stroke();
clip()
语法: context.clip();
示例:
var c=document.getElementById("myCanvas2");
var ctx=c.getContext("2d");
//剪切一个矩形区域
ctx.rect(50,20,200,120);
ctx.stroke();
ctx.clip();
//剪切之后画一个矩形
ctx.fillStyle="red";
ctx.fillRect(0,0,150,100);
效果:
一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)。您也可以在使用 clip() 方法前通过使用
save()
方法对当前画布区域进行保存,并在以后的任意时间对其进行恢复(通过restore()
方法)。
quadraticCurveTo(cpx, cpy, x, y)
语法: context.quadraticCurveTo(cpx, cpy, x, y);
参数 | 描述 |
---|---|
(cpx, cpy) | 贝塞尔控制点的 坐标。 |
(x, y) | 结束点的 坐标。 |
示例:
ctx.beginPath();
ctx.moveTo(20,20);
ctx.quadraticCurveTo(20,100,200,20);
ctx.stroke();
效果:
代码分析:
二次贝塞尔曲线需要两个点:
- 第一个点(20, 100)是用于二次贝塞尔计算中的控制点。
- 第二个点(200, 20)是曲线的结束点。
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
语法: context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
参数 | 描述 |
---|---|
(cp1x, cp1y) | 第一个贝塞尔控制点的 坐标。 |
(cp2x, cp2y) | 第二个贝塞尔控制点的 坐标。 |
(x, y) | 结束点的 坐标。 |
示例:
cv_ctx.beginPath();
cv_ctx.moveTo(0,50);
cv_ctx.bezierCurveTo(25,0,75,100,100,50);
cv_ctx.stroke();
效果:
三次贝塞尔曲线需要三个点:
- 前两个点是用于三次贝塞尔计算中的控制点。原理同二次贝塞尔曲线
- 第三个点是曲线的结束点。
arc(x, y, r, sAngle, eAngle, counterclockwise?)
语法: context.arc(x, y, r, sAngle, eAngle, counterclockwise?);
参数 | 描述 |
---|---|
(x, y ,r) | 圆的中心的 坐标、半径。 |
sAngle | 起始角,以弧度计(弧的圆形的三点钟位置是 0 度)。 |
eAngle | 结束角,以弧度计。 |
counterclockwise | 可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。 |
arcTo(x1, y1, x2, y2, r)
语法: context.arcTo(x1, y1, x2, y2, r);
参数 | 描述 |
---|---|
x1 | 两切线交点的横坐标。 |
y1 | 两切线交点的纵坐标。 |
x2 | 第二条切线上一点的横坐标。 |
y2 | 第二条切线上一点的纵坐标。 |
r | 弧的半径。 |
示例:
ctx.beginPath();
ctx.moveTo(20,20); // 创建起始点
ctx.lineTo(100,20); // 创建水平线
ctx.arcTo(150,20,150,70,50); // 创建弧
ctx.lineTo(150,120); // 创建垂直线
ctx.stroke(); // 画出来
其中第一条线上的任意一点的横纵坐标为上一次点的位置,此示例中为 100,20。由 (x1,y1),(x2,y2),(100,20) 三点可确定两条直线的位置再由半径确定弧的位置。
isPointInPath(x, y)
语法: context.isPointInPath(x, y);
如果指定的点位于当前路径中,isPointInPath() 方法返回 true,否则返回 false。
转换
方法 | 描述 |
---|---|
scale(scalewidth,scaleheight) | 缩放 当前绘图至更大或更小。 |
rotate(angle) | 旋转 当前绘图。 |
translate(x, y) | 平移 重新映射画布上的 (0,0) 位置。 |
transform(a, b, c, d, e, f) | 替换绘图的当前转换矩阵。 |
setTransform(a, b, c, d, e, f) | 将当前转换重置为单位矩阵。然后运行 transform()。 |
scale(scalewidth,scaleheight)
语法: context.scale(scalewidth,scaleheight);
参数 | 描述 |
---|---|
scalewidth | 缩放当前绘图的宽度(1=100%,0.5=50%,2=200%,依次类推)。 |
scaleheight | 缩放当前绘图的高度(1=100%,0.5=50%,2=200%,依次类推)。 |
示例:
var ctx=c.getContext("2d");
ctx.strokeRect(5,5,25,15);
ctx.scale(2,2);
ctx.strokeRect(5,5,25,15);
ctx.scale(2,2);
ctx.strokeRect(5,5,25,15);
ctx.scale(2,2);
ctx.strokeRect(5,5,25,15);
注意:对绘图进行缩放,所有之后的绘图也会被缩放。定位也会被缩放。
rotate(angle)
语法: context.rotate(angle);
参数 | 描述 |
---|---|
angle | 旋转角度,以弧度计。 |
- 如需将角度转换为弧度,请使用 degrees*Math.PI/180 公式进行计算。
示例:
如需旋转 20 度,可规定下面的公式:20*Math.PI/180。
ctx.rotate(20*Math.PI/180);
ctx.fillRect(50,20,100,50);
效果:
translate(x, y)
语法: context.translate(x, y);
示例:
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.fillRect(10,10,100,50);
ctx.translate(70,70);
ctx.fillRect(10,10,100,50);
效果:
-
transform(a, b, c, d, e, f)
,setTransform(a, b, c, d, e, f)
语法: context.transform(a, b, c, d, e, f);
语法: context.setTransform(a, b, c, d, e, f);
参数 | 描述 |
---|---|
a | 水平缩放绘图。 |
d | 垂直缩放绘图。 |
b | 水平倾斜绘图。 |
c | 垂直倾斜绘图。 |
e | 水平移动绘图。 |
f | 垂直移动绘图。 |
这里b
、c
的理解有点绕,请看示例。
cv_ctx.beginPath();
cv_ctx.moveTo(150,101);
cv_ctx.lineTo(150,116);
cv_ctx.strokeStyle = "black";
cv_ctx.stroke();
cv_ctx.beginPath();
cv_ctx.moveTo(200,101);
cv_ctx.lineTo(200,121);
cv_ctx.strokeStyle = "red";
cv_ctx.stroke();
cv_ctx.beginPath();
cv_ctx.moveTo(0,100);
cv_ctx.lineTo(200,100);
cv_ctx.strokeStyle = "green";
cv_ctx.stroke();
cv_ctx.transform(1, 0.1, 0, 1, 0, 0);
cv_ctx.beginPath();
cv_ctx.moveTo(0,100);
cv_ctx.lineTo(200,100);
cv_ctx.strokeStyle = "blue";
cv_ctx.stroke();
cv_ctx.transform(1, -0.2, 0, 1, 0, 0);
// cv_ctx.setTransform(1, -0.1, 0, 1, 0, 0)
cv_ctx.beginPath();
cv_ctx.moveTo(0,100);
cv_ctx.lineTo(200,100);
cv_ctx.strokeStyle = "purple";
cv_ctx.stroke();
效果:
代码解析:
蓝色线,b
= 0.1,意思是:沿着与X轴的方向,绘制一条与X轴上的每个点(x, 0)相距 x * 0.1 一条线。
- 该变换只会影响 transform() 方法调用之后的绘图。
transform()
方法会相对于其他变换来发生行为,即累计,如果已经将绘图设置为放到两倍,再调用 transform() 方法把绘图放大两倍,最终绘图将放大四倍。setTransform()
方法把当前的变换矩阵 重置,然后以相同的参数运行 transform()。
cv_ctx.transform(1, -0.2, 0, 1, 0, 0); 等价 cv_ctx.setTransform(1, -0.1, 0, 1, 0, 0)
文本
属性 | 描述 |
---|---|
font | 设置或返回 文本内容的当前字体属性。 |
textAlign | 设置或返回 文本内容的当前对齐方式。 |
textBaseline | 设置或返回 在绘制文本时使用的当前文本基线。 |
方法 | 描述 |
---|---|
fillText(text, x, y, maxWidth?) | 在画布上绘制"被填充的"文本。 |
strokeText(text, x, y, maxWidth?) | 在画布上绘制文本(无填充)。 |
measureText(text) | 返回包含指定文本宽度的对象。 |
font
语法: context.font="italic small-caps bold 12px arial";
属性值:
值 | 描述 |
---|---|
font-style | 规定字体样式。可能的值:normal、italic、oblique |
font-variant | 规定字体变体。可能的值:normal、small-caps |
font-weight | 规定字体的粗细。可能的值:normal、bold、bolder、lighter、100、200、300、400、500、600、700、800、900、 |
font-size / line-height | 规定字号和行高,以像素计。 |
font-family | 规定字体系列。 |
caption | 使用标题控件的字体(比如按钮、下拉列表等)。 |
icon | 使用用于标记图标的字体。 |
menu | 使用用于菜单中的字体(下拉列表和菜单列表)。 |
message-box | 使用用于对话框中的字体。 |
small-caption | 使用用于标记小型控件的字体。 |
status-bar | 使用用于窗口状态栏中的字体。 |
textAlign
语法: context.textAlign="center | end | left | right | start";
值 | 描述 |
---|---|
start | 默认。文本在指定的位置开始。 |
end | 文本在指定的位置结束。 |
center | 文本的中心被放置在指定的位置。 |
left | 文本在指定的位置开始。 |
right | 文本在指定的位置结束。 |
效果:
textBaseline
语法: context.textBaseline="alphabetic | top | hanging | middle | ideographic | bottom";
值 | 描述 |
---|---|
alphabetic | 默认。文本基线是普通的字母基线。 |
top | 文本基线是 em 方框的顶端。 |
hanging | 文本基线是悬挂基线。 |
middle | 文本基线是 em 方框的正中。 |
ideographic | 文本基线是表意基线。 |
bottom | 文本基线是 em 方框的底端。 |
效果:
-
fillText(text,x,y,maxWidth?)
、stroktText(text,x,y,maxWidth?)
语法: context.fillText(text,x,y,maxWidth);
语法: context.strokeText(text,x,y,maxWidth);
参数 | 描述 |
---|---|
text | 规定在画布上输出的文本。 |
x | 开始绘制文本的 x 坐标位置(相对于画布)。 |
y | 开始绘制文本的 y 坐标位置(相对于画布)。 |
maxWidth | 可选。允许的最大文本宽度,以像素计。 |
measureText(text)
语法: context.measureText(text).width;
图像绘制
方法 | 描述 |
---|---|
drawImage(img, sx, sy, swidth, sheight, x, y, width, height) | 向画布上绘制图像、画布或视频。 |
drawImage(iimg,sx,sy,swidth,sheight,x,y,width,height)
语法: context.drawImage(img, x, y);
语法: context.drawImage(img, x, y, width , height);
语法: context.drawImage(img, sx, sy, swidth, sheight, x, y, width, height);
参数 | 描述 | |
---|---|---|
img | 规定要使用的图像、画布或视频。 | |
sx | 可选。开始剪切的 x 坐标位置。 | |
sy | 可选。开始剪切的 y 坐标位置。 | |
swidth | 可选。被剪切图像的宽度。 | |
sheight | 可选。被剪切图像的高度。 | |
x | 在画布上放置图像的 x 坐标位置。 | |
y | 在画布上放置图像的 y 坐标位置。 | |
width | 可选。要使用的图像的宽度(伸展或缩小图像)。 | |
height | 可选。要使用的图像的高度(伸展或缩小图像)。 |
像素操作
属性 | 描述 |
---|---|
width | 返回 ImageData 对象的宽度。 |
height | 返回 ImageData 对象的高度。 |
data | 返回一个对象,其包含指定的 ImageData 对象的图像数据。 |
方法 | 描述 |
---|---|
createImageData((width, height) | imageData) | 创建新的、空白的 ImageData 对象。 |
getImageData(x, y, width, height) | 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据。 |
putImageData(imgData, x, y, dirtyX?, dirtyY?, dirtyWidth?, dirtyHeight?) | 把图像数据(从指定的 ImageData 对象)放回画布上。 |
createImageData((width, height) | imageData)
以指定的尺寸(以像素计)创建新的 ImageData 对象:
语法: var imgData=context.createImageData(width,height);
创建与指定的另一个 ImageData 对象尺寸相同的新 ImageData 对象(不会复制图像数据):
语法: var imgData=context.createImageData(imageData);
createImageData()
方法创建新的空白 ImageData 对象。新对象的默认像素值 transparent black。
对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值:
R - 红色(0-255)
G - 绿色(0-255)
B - 蓝色(0-255)
A - alpha 通道(0-255; 0 是透明的,255 是完全可见的)
因此 ,transparent black 表示 (0,0,0,0)。
color/alpha 信息以数组形式存在,并且由于数组包含了每个像素的四条信息,所以数组的大小是 ImageData 对象的四倍:width * height * 4。(获得数组大小有更简单的办法,就是使用 ImageDataObject.data.length
)
包含 color/alpha 信息的数组存储于 ImageData 对象的 data
属性中。
示例1:
把 ImageData 对象中的像素变为红色的语法:
imgData=ctx.createImageData(100,100);
for (var i=0;i<imgData.data.length;i+=4) {
imgData.data[i+0]=255;
imgData.data[i+1]=0;
imgData.data[i+2]=0;
imgData.data[i+3]=255;
}
getImageData(x, y, width, height)
语法: context.getImageData(x, y, width, height);
putImageData(imgData, x, y, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
语法: context.putImageData(imgData, x, y, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
参数 | 描述 |
---|---|
imgData | 规定要放回画布的 ImageData 对象。 |
(x, y) | ImageData 对象左上角的 坐标,以像素计。 |
dirtyX | 可选。水平值(x),以像素计,在画布上放置图像的位置。 |
dirtyY | 可选。垂直值(y),以像素计,在画布上放置图像的位置。 |
dirtyWidth | 可选。在画布上绘制图像所使用的宽度。 |
dirtyHeight | 可选。在画布上绘制图像所使用的高度。 |
合成
属性 | 描述 |
---|---|
globalAlpha | 设置或返回绘图的当前 alpha 或 透明值。 |
globalCompositeOperation | 设置或返回 新图像如何绘制到已有的图像上。 |
globalAlpha
语法: context.globalAlpha=number;
示例:
cv_ctx.globalAlpha=0.2;
cv_ctx.fillStyle="red";
cv_ctx.fillRect(20,20,75,50);
// Turn transparency on
cv_ctx.globalAlpha=1;
cv_ctx.fillStyle="blue";
cv_ctx.fillRect(50,50,75,50);
cv_ctx.globalAlpha=0.2;
cv_ctx.fillStyle="green";
cv_ctx.fillRect(80,80,75,50);
效果:
globalCompositeOperation
语法: context.globalCompositeOperation="source-in";
值 | 描述 |
---|---|
source-over | 默认。在目标图像上显示源图像。 |
source-atop | 在目标图像顶部显示源图像。源图像位于目标图像之外的部分是不可见的。 |
source-in | 在目标图像中显示源图像。只有目标图像之内的源图像部分会显示,目标图像是透明的。 |
source-out | 在目标图像之外显示源图像。只有目标图像之外的源图像部分会显示,目标图像是透明的。 |
destination-over | 在源图像上显示目标图像。 |
destination-atop | 在源图像顶部显示目标图像。目标图像位于源图像之外的部分是不可见的。 |
destination-in | 在源图像中显示目标图像。只有源图像之内的目标图像部分会被显示,源图像是透明的。 |
destination-out | 在源图像之外显示目标图像。只有源图像之外的目标图像部分会被显示,源图像是透明的。 |
lighter | 显示源图像 + 目标图像。 |
copy | 显示源图像。忽略目标图像。 |
xor | 使用异或操作对源图像与目标图像进行组合。 |
其他
方法 | 描述 |
---|---|
save() | 保存当前环境的状态。 |
restore() | 返回之前保存过的路径状态和属性。 |
createEvent() | |
getContext() | |
toDataURL() |