方法一
假设白色区域是透明的,黑色是不透明的,那么你可以使用复合模式:
ctx.globalCompositeOperation = 'source-in';
... draw graphics on top - only solid color will be affected ...
ctx.globalCompositeOperation = 'source-over'; // reset to default mode
A demo fiddle for this here
方法二
另一种更简单的方法是简单地用您需要的图形填充画布,然后将clearRect() 用于您想要透明的区域。
此操作相当快,因此不应有任何闪烁(如果您可以通过单个 requestAnimationFrame 调用触发此操作)。
A demo fiddle with clearRect
A demo fiddle with clearRect + requestAnimationFrame
请注意,调用 rAF 会使代码异步,但使用它的目的是您的绘制操作在帧更新中同步,因此将消除闪烁(如果您由于某种原因遇到问题)。
方法3
通过对rect() 的一系列调用,围绕您要保留的区域创建矩形区域。使用clip()作为剪贴蒙版的集合。
如果非裁剪区域按特定顺序排列,则此技术效果最佳,否则您必须定义很多区域。
记得先将画布平移 0.5 像素,矩形只使用整数值。
方法四
手动解析像素缓冲区以填充满足要求的区域中的像素,例如仅非透明像素。
请注意,这可能是最慢的方法,它受 CORS 限制的影响(如果你先在画布上绘制外部图像),如果你想填充形状、图像、渐变等,它会更加乏味第四,如果您可能更喜欢屏幕外的画布来复制。
还有其他方法可以使用不同的合成模式和绘制顺序来获得相同的结果,但我保留它,因为它应该涵盖大多数场景。