使用HTML5 <canvas>元素,我想加载一个图像文件(PNG, JPEG等),将其完全透明地绘制到画布上,然后将其淡入。我已经弄清楚如何加载图像并将其绘制到画布上,但我不知道如何改变其不透明度。

这是我到目前为止的代码:

var canvas = document.getElementById('myCanvas');
    
if (canvas.getContext)
{
    var c           = canvas.getContext('2d');
    c.globalAlpha   = 0;
    
    var img     = new Image();
    img.onload  = function() {
        c.drawImage(img, 0, 0);
    }
    img.src     = 'image.jpg';
}

有人能给我指出正确的方向吗比如设置一个属性或者调用一个函数来改变透明度?


当前回答

我认为这最好地回答了问题,它实际上改变了已经画出来的东西的alpha值。也许当这个问题被问到时,这不是api的一部分。

给定2d context c。

function reduceAlpha(x, y, w, h, dA) {
    let screenData = c.getImageData(x, y, w, h);
    for(let i = 3; i < screenData.data.length; i+=4){
        screenData.data[i] -= dA; //delta-Alpha
    }
    c.putImageData(screenData, x, y );
}

其他回答

你不能。它是即时模式图形。但是你可以通过在它上面画一个不透明的矩形来模拟它。

如果图像的上方不是恒定的颜色,那么它就会变得相当棘手。在这种情况下,您应该能够使用像素操作方法。在绘制图像之前保存该区域,然后在不透明的情况下将其混合到顶部。

在画布上,我首先在一个自运行函数中绘制矩形0,0,canvas.width,canvas。高度作为画布的背景,我将globalAlpha设置为1 .然后我在自己的函数中绘制其他形状,并将其globalAlpha设置为0。无论数字是多少,它们都不会相互影响。

设置全局Alpha绘制具有不透明度的对象,然后将其设置为正常。

//////////////////////// 圆 /////////////////////// ctx。globalAlpha = 0.75; ctx.beginPath (); ctx。圆弧(x1, y1, r1, 0, Math.PI*2); ctx。fillStyle =颜色; ctx.fill (); ctx.closePath (); ctx。globalAlpha = 1;

你可以。透明画布可以通过使用目标输出全局合成操作快速褪色。它不是100%完美的,有时它会留下一些痕迹,但它可以调整,取决于什么需要(即使用'source-over',用alpha为0.13的白色填充它,然后褪色以准备画布)。

// Fill canvas using 'destination-out' and alpha at 0.05
ctx.globalCompositeOperation = 'destination-out';
ctx.fillStyle = "rgba(255, 255, 255, 0.05)";
ctx.beginPath();
ctx.fillRect(0, 0, width, height);
ctx.fill();
// Set the default mode.
ctx.globalCompositeOperation = 'source-over';

就像Ian说的,使用c.globalAlpha = 0.5来设置不透明度,输入正方形的其他设置,然后使用c.save();。这将保存正方形的设置,然后你可以按照你想要的方式对正方形进行c.rect和c.fillStyle。后来我选择不使用c.restore来包装它,它工作得很好