有没有办法停止对画布数据的 alpha 通道进行预乘,或者有一种解决方法?
我想生成一个图像(在这种情况下是一些随机的 rgba 值)并将画布另存为图像。
在第二步中,我想使用 imageData 将原始图像与生成的图像进行比较,但是由于生成图像中我的 rgba 像素的 alpha 通道的预乘,这将不起作用。
function drawImage(ctx) {
var img = ctx.createImageData(canvas.width,canvas.height);
for (var i=img.data.length;i-=4;) {
img.data[i] = Math.floor(Math.random() * 255);
img.data[i+1] = Math.floor(Math.random() * 255);
img.data[i+2] = Math.floor(Math.random() * 255);
img.data[i+3] = Math.floor(Math.random() * 255);
}
ctx.putImageData(img, 0, 0);
// our image data we just set
console.log(img.data);
// the image data we just placed onto the canvas
console.log(ctx.getImageData(0,0,canvas.width, canvas.height).data);
}
在控制台中,您会发现两个 console.log 输出。第一个在预乘之前,第二个在预乘之后。这两个输出是不同的,有些值相差 3 或更多。这仅在涉及部分透明度时发生(alpha 设置为 255 以外的任何值)。
有没有办法获得相同的输出?关于这个问题的任何想法?任何想法如何为这个问题创建类似解决方法的东西?
先感谢您!