目前的问题有点不清楚IMO。要给出一个更一般的答案,您可以将其应用于需要剪辑的场景,您可以使用(至少)两种方法:
方法 1 - 使用复合模式进行剪辑
复合模式是最简单的方式,但也是最不灵活的方式,因为您需要将剪贴蒙版预定义为具有透明背景(通常为 PNG)的图像。
您可以使用图像的实体部分来剪辑下一个绘制的东西,或者使用透明区域来填充。
这是一种方法,我们使用实体部分来剪辑下一个绘制的形状/图像:
/// draw the shape we want to use for clipping
ctx1.drawImage(imgClip, 0, 0);
/// change composite mode to use that shape
ctx1.globalCompositeOperation = 'source-in';
/// draw the image to be clipped
ctx1.drawImage(img, 0, 0);
此处globalCompositeOperation
将更改为source-in
这意味着源图像(我们将在目标旁边绘制的图像)将在现有实体数据中绘制。不会将任何内容绘制到透明区域。
如果我们的剪贴蒙版看起来像这样(来自网络的随机合理使用):
我们的形象是这样的:
结果将是这样的:
方法 2 - 使用路径进行剪辑
您还可以为剪辑定义路径。这非常灵活,因为您可以根据需要调整路径或为其设置动画。
注意:请记住,使用路径进行剪辑目前在浏览器中有点“脆弱”,因此您应该考虑在设置save()
和restore()
使用剪辑路径之前和之后使用,因为浏览器目前无法重置剪辑(restore
将恢复默认剪辑=完整画布);
让我们定义一个简单的之字形路径(在您的情况下,这将是您的波浪):
/// use save when using clip Path
ctx2.save();
ctx2.beginPath();
ctx2.moveTo(0, 20);
ctx2.lineTo(50,0);
/// ... more here - see demo
ctx2.lineTo(400, 20);
ctx2.lineTo(400, 100);
ctx2.lineTo(0, 100);
ctx2.closePath();
/// define this Path as clipping mask
ctx2.clip();
/// draw the image
ctx2.drawImage(img, 0, 0);
/// reset clip to default
ctx2.restore();
现在我们已经使用clip
绘制到画布上的任何内容设置了剪贴蒙版,接下来将被裁剪以适合该形状(请注意,我们确保形状可以在它开始的地方结束):