我有一个Uint32Array我试图转换为WebGL的纹理。为此,我将数组写为Canvas上的RGBA值,并从画布中获取base64编码的PNG作为纹理发送。
每当我将像素值设置为alpha为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。
谢谢!
答案 0 :(得分:3)
它似乎是PNG规范的一部分(http://www.libpng.org/pub/png/spec/1.2/png-1.2-pdg.html)。
...全透明像素应全部分配相同 最佳压缩的颜色值。
我找不到直接来源,但似乎这个特定的实现将所有通道设置为零。