我有一个具有以下rgba的2像素PNG图像:
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 似乎只有阿尔法通道值被保留,而像素颜色被任意改变。
到底怎么回事?
(在Linux上使用Firefox 41 )
编辑
从pngtoy玩具 nodejs模块的介绍中,我发现了以下内容:
在客户端使用JavaScript实现PNG文件解析器/读取器/译码器的低级实现。 为什么浏览器已经支持PNG了? 浏览器将简单地加载并将任何PNG类型转换为RGBA位图。它还将对图像应用ICC和伽马校正,从而产生与原始位图不同的值。
然而,我认为PNG本身应该有ICC和Gamma校正块,以便浏览器应用它们。浏览器是否对任何png文件进行这样的图像操作,即使文件中没有ICC/gamma块?
发布于 2015-10-25 13:34:50
Firefox将带有alpha的图像转换为前置的alpha,供内部使用。如果您的工作流程正在从Firefox的内部图像缓冲区恢复图像,则在逆转预多重alpha时,将失去精确性。在极端情况下,α等于零的像素将作为透明黑色返回,而不考虑原始PNG中的底层颜色。这种效果并不取决于颜色管理块是否存在。
请注意,当您单击PNG图像并“另存为.”时,不会发生这种情况;在本例中,返回原始PNG。
当出现颜色管理块( gfs.color_management.mode、sRGB、gAMA和/或cHRM)时,火狐还可以修改内部图像(取决于在“about:config”中的设置),但这个问题似乎并非如此。再说一遍,“除非.”将返回原始像素和颜色管理块不变。
https://stackoverflow.com/questions/33328780
复制相似问题