H5 - <canvas>

介绍

通过脚本(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() 规定渐变对象中的 颜色、停止位置、偏移量
  • fillStylestrokeStyle属性值
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);

效果:

  • shadowColorshadowBlurshadowOffsetXshadowOffsetY 阴影属性的值
属性 描述
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 垂直移动绘图。

这里bc的理解有点绕,请看示例。

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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容

  • 一、canvas简介 参考H5之canvasCanvas是HTML5新增的组件,它就像一块幕布,可以用JavaSc...
    合肥黑阅读 6,440评论 0 3
  • canvas元素的基础知识 在页面上放置一个canvas元素,就相当于在页面上放置了一块画布,可以在其中进行图形的...
    oWSQo阅读 10,266评论 0 19
  • canvas基本标签 < /canvas>宽高写在内部跟样式有区别的(样式设置-画出的图形宽高改变,内部设置-画出...
    闫子扬阅读 450评论 0 0
  • 简介 —————————————————————————————————————————————是一个新的HTML...
    Brighten_Sun阅读 12,819评论 2 4
  • 创建 canvas 标签: 当前浏览器不支持canvas。 *canvas 标签的宽高 必须在标签上定义。 用js...
    张小窝阅读 726评论 0 0