显示时浏览器是否更改了 png rgba 数据?

Is png rgba data changed by a browser when displayed?

我有一个 2 像素的 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-image 模块)

当图像被浏览器(firefox)加载并复制到canvas以测试rgba数据时,返回如下:

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

似乎只保留了 Alpha 通道值,而任意更改了像素颜色。

这是怎么回事?

(在 Linux 上使用 Firefox 41)

编辑

pngtoy nodejs 模块的介绍中,我发现了以下内容:

Low-level implementation of PNG file parser/reader/decoder using JavaScript on client size.

Why this when browsers support PNG already?

The browser will simply load and convert any PNG type into RGBA bitmaps. It will also apply ICC and gamma correction to the image resulting in different values than in the original bitmap.

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

Firefox 将带有 alpha 的图像转换为预乘 alpha 以供内部使用。如果您的工作流程是从 Firefox 的内部图像缓冲区恢复图像,则在反转预乘 alpha 时会损失精度。在极端情况下,alpha 等于零的像素将 returned 为透明黑色,而不管原始 PNG 中的底层颜色如何。此效果不取决于颜色管理块是否存在。

请注意,当您单击 PNG 图像和 "save as..." 时不会发生这种情况;在这种情况下,原始 PNG 是 returned.

当存在颜色管理块(iCCP、sRGB、gAMA、and/or cHRM)时,Firefox 也可能会修改内部图像(取决于 "about:config" 中 gfs.color_management.mode 的设置) ,但对于这个特定问题,情况似乎并非如此。同样,"save as..." 将 return 原始像素和颜色管理块保持不变。