2015-10-25 31 views
0

我有以下RGBA 2像素PNG图像:显示时,浏览器是否更改了png rgba数据?

image.setAt(0, 0, { red:255, green:10, blue:10, alpha:100 }); 
image.setAt(1, 0, { red:255, green:255, blue:55, alpha:255 }); 
image.setAt(0, 1, { red:90, green:10, blue:65, alpha:250 }); 
image.setAt(1, 1, { red:60, green:255, blue:0, alpha:14 }); 

(使用节点的pngjs图像模块)

当图像是由浏览器(Firefox)加载并复制到画布测试rgba数据,将返回以下内容:

255 7 7 100 
255 255 55 255 
89 9 64 250 
54 255 0 14 

似乎只有Alpha通道值被保留,而像素颜色被任意改变。

发生了什么事?

(使用Firefox 41在Linux上)

编辑

从介绍上pngtoy的NodeJS模块我发现以下几点:

PNG文件解析器/读者的低级实现/解码器使用 客户端大小的JavaScript。

为什么当浏览器支持PNG时呢?

浏览器将简单地加载并将任何PNG类型转换为RGBA 位图。它还会对图像 应用ICC和伽马校正,从而产生与原始位图不同的值。

但是,我认为PNG本身应该有ICC和Gamma校正块,以便浏览器应用它们。浏览器是否对任何PNG文件进行这种图像处理,即使文件内没有ICC ​​/ gamma块?

+0

火狐的行为取决于gfx.color_manangement.mode有关设置:配置(默认值是2,尝试重置它为0,看看会发生什么),以及您的2x2的图像是否包含色彩管理信息(GAMA(sRGB)中, cHRM和/或iCCP块)。如果您发布实际的PNG文件的副本,这将会很有帮助。 –

+0

稍后我会放入原始日期。用gfx播放没有成功。没有其他数据在PNG中:只有IHDR,IDAT和IEND块在里面。 – rlib

+0

好的消除了color_management。剩下的可能是转换为预乘alpha和后。如果你有一个alpha == 0的彩色像素,会发生什么? –

回答

2

Firefox将alpha图像转换为预乘alpha的图像供内部使用。如果您的工作流程正在从Firefox的内部图像缓冲区中恢复图像,那么在反转预倍数Alpha时将会失去精度。在极端情况下,无论原始PNG中的基础颜色如何,alpha等于零的像素都将返回为透明黑色。这种效果不取决于颜色管理块是否存在。

注意,当你点击一个PNG图像上,这不会发生“另存为...”;在这种情况下,原始的PNG被返回。

当色彩管理块(iCCP,sRGB,gAMA和/或cHRM)出现时,Firefox也可能会修改内部图像(取决于gfs.color_management.mode在“about:config”中的设置),但是似乎并不是这个特定问题的情况。再次,“另存为...”将返回原来的像素和色彩管理块不变。

+0

太好了,谢谢! – rlib

相关问题