我想知道是否存在一种方法可以将特定 CMYK 颜色空间(比如 FOGRA39)的颜色转换为 CIEXYZ。 我知道如何将 sRGB 转换为 CIEXYZ,因为互联网上有许多“操作方法”。 但我从未找到类似的 FOGRA39 变换方程(或任何其他打印色彩空间)。 有人有经验可以和我分享吗? 谢谢你。
简短回答
这些色彩空间转换不是以公式的形式描述的,而是(主要)以 ICC 配置文件(.icc 文件)中的查找表的形式描述的。
更长的答案
某些颜色空间中的颜色值通过相对简单的封闭式表达式与其他颜色空间相关。众所周知的例子是 XYZ 和 Lab 之间的关系,以及您提到的 sRGB 和 XYZ 之间的关系。通常,相应的变换公式是从颜色理论的考虑中获得的。另一方面,通过执行实际印刷实验来表征与实际或理想化印刷工艺(例如
FOGRA39)相对应的色彩空间。这是通过在受控环境下在正在分析的设备(例如印刷机)上打印大量不同的色块,并使用光谱仪测量所得打印色块的颜色来完成的。
这些测量结果不会产生用于颜色空间之间转换的简单公式,而是产生大量成对颜色值的表:已知的打印墨水量(例如 CMYK)与测量的颜色。然后,该颜色配置文件表通常以标准化(文件)格式存储:ICC 配置文件。这是 FOGRA39 的 ICC 配置文件。 (实际上,虽然查找表是典型 ICC 配置文件的重要组成部分,但 ICC 配置文件还支持参数曲线和矩阵变换来进行色彩空间转换。)
对于大多数用户来说,ICC 文件格式过于复杂,难以解析和解释,色彩管理也过于繁琐,无法从头开始实现。如果您需要在 ICC 配置文件表示的颜色空间之间执行颜色转换,通常会使用操作系统或第三方库提供的颜色管理工具。当今使用的几乎所有颜色管理系统 (CMS) 都支持 ICC 配置文件,并且它们的 API 支持使用 ICC 配置文件进行颜色转换。
Mac 和 Windows 等主要平台都有自己的色彩管理系统和 API 供您使用,并且在 Linux 上也可以使用开源解决方案(例如
little cms)。然而,具体细节取决于目标平台和打算使用的编程语言。
Unicolour .NET 库中添加了 ICC 转换功能,并使用 FOGRA39 (CMYK) 和 FOGRA55 (CMYKOGV) 进行了测试。
var iccConfig = new IccConfiguration("./Fogra39.icc", Intent.RelativeColorimetric);
var config = new Configuration(iccConfiguration: iccConfig);
var navyRgb = new Unicolour(config, ColourSpace.Rgb255, 0, 0, 128);
Console.WriteLine(navyRgb.Icc); // 1.0000 0.8977 0.0001 0.2867 CMYK
var navyCmyk = new Unicolour(config, new Channels(1.0, 1.0, 0.0, 0.5));
Console.WriteLine(navyCmyk.Rgb.Byte255); // 46 37 87