色彩管理与 ICC
ICC 配置文件描述像素值应当如何解释,它本身不是又一张图像。丢掉、忽略或套错配置文件时,文件仍然可以解码、缩放并重新编码,画面却可能已经偏离来源。
档案描述的是解释,不是像素
Section titled “档案描述的是解释,不是像素”常见的来源差异包括:
- 无标记的 RGB,被各入口按 sRGB 或按原始通道直接处理。
- 嵌入 ICC 的 RGB,需要先决定是保留、转换成目标空间,还是在导出时剥离。
- CMYK,通道含义和 RGB 不同;把它当成三通道 RGB 会得到错误颜色。
- Display P3 等宽色域,在 sRGB 屏幕或编码器里可能被裁切,文件却仍然“有效”。
libvips 用 colourspace 和 icc_transform 一类操作表达这些转换。binding 可能把它包进导入选项、导出选项,或要求调用方显式调用。包装层的默认值必须按该 binding 的文档核对,不能从函数能够返回推断转换已经发生。
看似成功的几种情况
Section titled “看似成功的几种情况”- 输出能打开,尺寸和通道数也符合预期,但配置文件在导出时被去掉了。
- CMYK 输入被解码成某个 RGB,调用方没有记录源配置和目标配置。
- 缩略图路径为了速度跳过色彩转换,而全尺寸路径没有跳过,两套结果因此不同。
- 一个入口链接的 libvips 带 LittleCMS,另一个构建没有,同样的调用名不会做同样的事。
这些情况都需要输入里真实存在的配置文件,以及导出后重新读回的配置文件名称或“确实没有配置文件”这一事实。当前样本做不到这一点。
本手册目前没有的证据
Section titled “本手册目前没有的证据”已执行的 JPEG 是普通的 3 通道照片,不能用来证明 CMYK、P3 或 ICC 往返。在有可公开再分发的配置文件样本之前:
- 不给出 “转换到 sRGB 后颜色正确” 的结论;
- 不比较四个 binding 的色彩像素;
- 不把 Alpha 页里的透明图形当作色彩管理样例。
颜色异常的排查入口是色彩偏移。透明度是另一条线,见 Bands、Alpha 与透明度。