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

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

谢谢!

最佳答案

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



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

07-24 09:44
查看更多