您可以在RGB 和CMYK 色彩空间之间进行近似转换,但它不会完全准确或双向。 两个相关的色彩空间之间存在许多差异在这里,包括它们各自的色域(参见 oezi 答案中的图表)、加法与减法模型,以及 CMYK 空间中黑色(键)的存在。
如果您只是对将颜色从其 RGB 转换为 CMYK 表示的简单方法感兴趣,您可以使用以下代码(在 C# 中任意;随意转换为您选择的语言):
public CmykColor RgbToCmyk(int R, int G, int B)
{
if ((R < 0) || (R > 255) || (G < 0) || (G > 255) || (B < 0) || (B > 255)) {
throw new ArgumentException("RGB values must be in the range of 0 to 255");
}
if ((R == 0) && (G == 0) && (B == 0)) {
return new CmykColor(0, 0, 0, 1);
} else {
double calcR = 1 - (R / 255);
double calcG = 1 - (G / 255);
double calcB = 1 - (B / 255);
double K = Math.Min(calcR, Math.Min(calcG, calcB));
double C = (calcR - K) / (1 - K);
double M = (calcG - K) / (1 - K);
double Y = (calcB - K) / (1 - K);
return new CmykColor(Convert.ToInt32(C), Convert.ToInt32(M), Convert.ToInt32(Y), Convert.ToInt32(K));
}
}
但是您必须决定这个简单的近似值是否会产生“足够接近”满足您需求的结果。 要实现的最重要的事情是,真正的转换完全取决于物理设备/过程,并且需要为您的每个设备(显示 RGB 的显示器、打印 CMYK 的打印机和基材)精确校准颜色配置文件接收 CMYK)。
这有助于解释为什么上述算法(或您可能自行实现的任何其他算法)永远无法匹配 Photoshop 返回的结果,Photoshop 使用颜色配置文件和一些额外的专有算法来处理其转换。如果这种精确度真的很重要,您可以考虑使用类似Windows Color Management APIs 的工具来为您处理转换,这将自动应用当前颜色配置文件,但您可能会发现这些结果与 Photoshop 的不完全匹配要么。
底线是颜色是主观的。正如我在开头提到的,即使你克服了准确性障碍,你仍然不会有一个双向的转换过程。 即使在 Photoshop 中,您也无法在不丢失或更改某些颜色信息的情况下将图像从 RGB 转换为 CMYK,然后再转换回来。
编辑:您在 cmets 中多次提到您只需要“RGB 百分比值”。我假设这意味着 CMYK 百分比,但我想值得指出的是,如果您只想将 RGB 组件的标准 0-255 值转换为 RGB 百分比,您可以将每个值除以 255(最大值),然后乘以 100。因此,例如:
红色 = RGB(255, 0, 0) = 100% 红色,0% 绿色,0% 蓝色
DarkSeaGreen = RGB(143, 188, 143) = 56% 红色,74% 绿色,56% 蓝色