3

我有一个 Uint32Array 我正在尝试将其转换为 WebGL 的纹理。为此,我将数组作为 RGBA 值写入画布上,并从画布中获取 base64 编码的 PNG 以作为纹理发送。

每当我将像素值设置为 0 时,相应的 RGB 通道也会在转换为 PNG 时归零。这是一个实现细节吗?如果我要在其他一些非 HTML5 程序中创建 PNG,我可以有一个(RGBA)四组(255,255,255,0)吗?我尝试使用 alpha 值 1 并且所有其他通道保持不变,所以这不是预乘 alpha 的问题。

以下是一些重现此效果的 javascript 代码:

    var img = new Image();
    var canvasObj = $('<canvas width="1" height="1"></canvas>');
    var context = canvasObj[0].getContext('2d');
    var imgd = context.getImageData(0,0,1,1);
    var pix = imgd.data;
    pix[0]=255; pix[1]=255; pix[2]=255; pix[3]=0;
    context.putImageData(imgd,0,0);
    img.src = canvasObj[0].toDataURL("image/png");

    context.drawImage(img,0,0);
    var imgd2 = context.getImageData(0,0,1,1);
    var pix2 = imgd2.data;

pix2 将全为 0。

谢谢!

4

1 回答 1

3

它似乎是 PNG 规范 ( http://www.libpng.org/pub/png/spec/1.2/png-1.2-pdg.html ) 的一部分。

...完全透明的像素都应分配相同的颜色值以实现最佳压缩。

我找不到直接来源,但似乎这个特定的实现将所有通道都设置为零。

于 2012-07-22T17:02:37.800 回答