情况基本上是用基本的线性渐变绘制几个移动的原始形状,因此它们在透明的空白画布上重叠。它们与 alpha 通道值变化重叠的地方(即,它们流血)。
最后阶段是为每个单独的像素舍入 alpha,因此它是 0 或 255,具体取决于它更接近哪个。
使用 imageData 很容易做到 -
var ctxImage = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
var ctxData = ctxImage.data;
for (var i = 0; i < ctxData.length; i += 4) {
ctxData[i + 3] = ctxData[i + 3] > 128 ? 255 : 0;
// or ctxData[i + 3] = Math.round(ctxData[i + 3] / 255) * 255;
}
ctx.putImageData(ctxImage, 0, 0);
由于 getImageData 在 CPU 时间上非常昂贵,我希望制定一个使用 globalCompositeOperation 的解决方案,但似乎无法让它工作,有什么想法吗?