【发布时间】:2023-03-13 00:57:02
【问题描述】:
我有一个带有以下 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-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 模块的介绍中我发现了以下内容:
使用PNG文件解析器/读取器/解码器的低级实现 客户端大小的 JavaScript。
为什么浏览器已经支持 PNG?
浏览器将简单地加载任何 PNG 类型并将其转换为 RGBA 位图。它还将对图像应用 ICC 和伽马校正 导致与原始位图中的值不同。
但是,我认为 PNG 本身应该具有 ICC 和 Gamma 校正块,以便浏览器应用它们。即使文件中没有 ICC/gamma 块,浏览器是否会对任何 png 文件进行此类图像处理?
【问题讨论】:
-
Firefox 的行为取决于 about:config 中的 gfx.color_manangement.mode 设置(默认为 2,尝试将其重置为 0 看看会发生什么),以及您的 2x2 图像是否包含颜色管理信息(gAMA、sRGB、cHRM 和/或 iCCP 块)。如果您发布实际 PNG 文件的副本会很有帮助。
-
我稍后会放原始日期。玩gfx没有成功。 PNG 中没有其他数据:内部只有 IHDR、IDAT 和 IEND 块。
-
OK 消除了颜色管理。剩下的是可能转换为预乘 alpha 并返回。如果您有一个 alpha==0 的彩色像素会发生什么?
-
如果 alpha 为 0,则彩色像素设置为 0,0,0...