HTML5画布到PNG在alpha透明时将所有通道归零
HTML5 Canvas to PNG zeroes all channels when alpha transparent
我有一个Uint32Array,我正试图转换为WebGL的纹理。为了做到这一点,我将数组作为RGBA值写在画布上,并从画布中获得一个base64编码的PNG作为纹理发送。
每当我将像素值设置为alpha为0时,相应的RGB通道也会在转换为PNG时归零。这是一个实施细节吗?如果我在其他一些非HTML5程序中创建PNG,我能拥有(255255255,0)的(RGBA)四倍体吗?我尝试使用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。
谢谢!
它似乎是PNG规范的一部分(http://www.libpng.org/pub/png/spec/1.2/png-1.2-pdg.html)。
应为所有完全透明的像素分配相同的像素最佳压缩的颜色值。
我找不到直接的来源,但这个特定的实现似乎将所有通道设置为零。
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 递增一个数字而不去掉前导零
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 如何使用RGB或HSL显示HWB/HSB/CMYK通道
- 有没有一种方法可以在Javascript中进行可变递归currying
- 如何对不同的表递归使用以下代码
- 将jQuery对象传递到setTimeout递归函数中
- HTML5画布到PNG在alpha透明时将所有通道归零
- 用于清除数组/字符串中的零的递归函数
- 时刻.js:是否可以将时间(LT)归零
- 刷新不会将值归零,而是将其转换为值列表