合成的图形受限于绘制的顺序。如果我们不想受限于绘制的顺序,那么我们可以利用 globalCompositeOperation 属性来改变这种情况。
globalCompositeOperation = type
type为合成的类型:
裁剪的作用是遮罩,用来隐藏不需要的部分,所有在路径以外的部分都不会在 canvas 上绘制出来。
裁剪的效果和 globalCompositeOperation 属性的 source-in 和 source-atop差不多
但也有区别,最重要的区别是裁剪路径不会在 canvas 上绘制东西,而且它永远不受新图形的影响。
这些特性使得它在特定区域里绘制图形时特别好用。
clip(path, fillRule)
将当前正在构建的路径转换为当前的裁剪路径。
path为需要剪切的 Path2D 路径 fillRule为判断是在路径内还是在路径外,允许的值有 nonzero(默认值):非零环绕原则,evenodd:奇偶环绕原则
默认情况下,canvas 有一个与它自身一样大的裁剪路径(也就是没有裁剪效果)
现在可以通过clip()来创建一个裁剪路劲(也就有裁剪效果了)。
img.onload = () => {
ctx.arc(50, 50,50, 0, 2 * Math.PI, false)
ctx.clip()
ctx.drawImage(img,10,10, 50,50, 0, 0, 500, 500)
}
Path2D
Path2D 用来声明路径,用于裁剪不同的形状。
语法:Path2D(),它是一个构造函数,可以创建一个新的 Path2D 对象。
addPath()
添加一条新路径到对当前路径。
closePath()
使笔点返回到当前子路径的起始点。它尝试从当前点到起始点绘制一条直线。 如果图形已经是封闭的或者只有一个点,那么此函数不会做任何操作。
moveTo()
将一个新的子路径的起始点移动到 (x,y) 坐标。
lineTo()
使用直线连接子路径的终点到 x, y 坐标。
bezierCurveTo()
添加一条三次贝赛尔曲线到当前路径。 该方法需要三个点。 第一、第二个点是控制点,第三个点是结束点。起始点是当前路径的最后一个点,绘制贝赛尔曲线前,可以通过调用 moveTo() 进行修改。
quadraticCurveTo()
添加一条二次贝赛尔曲线到当前路径。
arc()
添加一条圆弧路径。 圆弧路径的圆心在 (x, y) 位置,半径为 r ,根据anticlockwise (默认为顺时针)指定的方向从 startAngle 开始绘制,到 endAngle 结束。
arcTo()
根据控制点和半径添加一条圆弧路径,使用直线连接前一个点。
ellipse()
添加一条椭圆路径。椭圆的圆心在(x,y)位置,半径分别是radiusX 和 radiusY ,按照anticlockwise (默认顺时针)指定的方向,从 startAngle 开始绘制,到 endAngle 结束。
rect()
创建一条矩形路径,矩形的起点位置是 (x, y) ,尺寸为 width 和 height。
img.onload = () => {
ctx.arc(50, 50,50, 0, 2 * Math.PI, false)
const path1 = new Path2D()
path1.rect(0, 0, 20, 20)
ctx.clip(path1)
ctx.drawImage(img,10,10, 50,50, 0, 0, 500, 500)
}