2

有一个 3x3 的图像。CanvasPixelArray 是:

[12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255]

我通过以下方式将所有像素的 alpha 更改为 0 并返回:

bobs = this.gfx.getImageData(0,0,3,3).data
for (a=3;a<bobs.data.length;a+=4)
bobs.data[a] = 0
this.gfx.putImageData(bobs,0,0)
bobs = this.gfx.getImageData(0,0,3,3).data
for (a=3;a<bobs.data.length;a+=4)
bobs.data[a] = 255
this.gfx.putImageData(bobs,0,0)

所有像素都变黑了。浏览器将颜色更改为黑色以节省内存。有没有办法防止这种情况,或者我应该保存一个副本?

4

1 回答 1

2

我认为原因是 Canvas 使用预乘 alpha,这意味着所有 rgb 值都乘以这些像素的 alpha 值。这样做是为了加快 alpha 与背景的混合等。

在这篇文章中有一个关于预乘 alpha 的部分:wikipedia:Alpha_compositing

正如您所说,您可能必须保留未修改值的副本,或者可能为图像存储一个 alpha 值并在绘制图像之前设置 globalAlpha 属性。(当我说图像时,您同样可以创建一个 3x3 画布,将像素存储在那里并使用 drawImage() 将其绘制到主画布上)。

于 2011-08-25T14:39:00.613 回答