【问题标题】:Canvas Painting Over with Apha Value具有 Apha 值的帆布绘画
【发布时间】:2025-11-28 22:15:01
【问题描述】:

我绘制的红色矩形应该会顺利消失。 如您所见here,它有效,但并没有完全消失。为什么?

(function init() {
    var canvas = document.getElementById('canvas'), ctx;
    if (!canvas.getContext) return;
    ctx = canvas.getContext('2d');

    ctx.fillStyle = "red";
    ctx.fillRect(0,0,canvas.width,canvas.height);
    ctx.fill();

    ctx.fillStyle = "rgba(255,255,255,0.1)";
    setInterval(function() {        
        ctx.fillRect(0,0,canvas.width,canvas.height);
        ctx.fill();
    }, 100);
}());

它还应该同时处理许多不同的颜色和 alpha 值。

谢谢你:D

【问题讨论】:

    标签: javascript canvas shader opacity alpha


    【解决方案1】:

    这是由于画布中的舍入错误。乘以 Alpha 通道的值将不得不削减分数以适应位图的整数性质。

    在所有情况下,该值永远不会变成完整的 alpha。

    解决方法是跟踪当前的 alpha 级别并在最后一个手动清除。

    Example here

    var tracker = 0,
        timer;
    
    ctx.fillStyle = "rgba(255,255,255,0.1)";
    timer = setInterval(function() {        
        ctx.fillRect(0,0,canvas.width,canvas.height);
        ctx.fill();
        tracker++;
        if (tracker > 43) {
            clearTimeout(timer);
            ctx.fillStyle = "rgb(255,255,255)";
            ctx.fillRect(0,0,canvas.width,canvas.height);
        }
    }, 100);
    

    【讨论】:

    • 感谢您的精彩解释。我无法使用该解决方法,因为画布上有许多具有不同 alpha 值的对象。
    • @ChristophBühler 只是将带有颜色和跟踪器的每个矩形嵌入到一个可以自我更新的对象中。然后生成不同的矩形并在同一个循环中更新它们(单个计时器)。这将使您只专注于单个对象。
    • 这与矩形无关。我将其用于阴影目的。性能损失太大而无法跟踪所有这些动态像素。