只要图像具有 alpha 通道,在没有某种机制来重置绘制的 alpha 值的情况下一遍又一遍地重新绘制它时,您就无法避免这种情况。
这样做的原因是该像素的 alpha 值将累积,因此当您在彼此之上绘制非不透明边缘(或抗锯齿边缘)时,alpha 通道的值将添加到已绘制的值导致边缘将越来越明显。
幸运的是,有几种方法可以避免这种情况:
A)如果您想在图像中保留 alpha 通道,请clearRect
在绘制图像之前使用。
context.clearRect(0, 0, img.width, img.height);
context.drawImage(img, 0, 0);
这将清除画布和 Alpha 通道。
ONLINE DEMO
B)如果 alpha 通道不重要,则保存没有任何 alpha 通道的图像(使用关闭透明度的 PNG 或使用 JPEG)。
还要注意示例中的循环 - 这不是重绘图像的好方法,因为您每次都启动加载/缓存检查以及图像解码。
您可以这样修改您的代码(随意采用):
var canvas = document.getElementById("event");
var context = canvas.getContext("2d");
var img = document.createElement('img'); // due to chrome bug
img.onload = drawImage; // set onload first
img.src = "../img/event.png"; // src last..
function drawImage() {
context.clearRect(0, 0, img.width, img.height);
context.drawImage(img, 0, 0);
setTimeout(drawImage, 3000);
}