将RGB颜色转换为CMYK?

我正在寻找一种algorithm来将RGB颜色转换为CMYK。 Photoshop正在执行下面的转换:

R = 220 G = 233 B = 174

C = 15 M = 0 Y = 40 K = 0

从RGB到CMYK的转换取决于用于放置CMYK油墨的物理设备/进程。 这些在软件中被表示为颜色configuration文件。 物理设备的ICC和ICM颜色configuration文件决定了最终的颜色。

如果您不关心物理设备上的真实表示,请在其他post中使用直接转换公式。

但是,如果您关心这方面的问题,那么您需要使用Windows颜色pipe理API或LittleCMS之类的function来为您进行颜色转换(因为它们在转换期间应用了正确的颜色configuration文件)。

如果你想得到好的结果,你需要应用一个颜色configuration文件。 在.NET中,您可以这样做(假定原始CMYK组件的范围介于0到255之间):

float[] colorValues = new float[4]; colorValues[0] = c / 255f; colorValues[1] = m / 255f; colorValues[2] = y / 255f; colorValues[3] = k / 255f; System.Windows.Media.Color color = Color.FromValues(colorValues, new Uri(@"C:\Users\me\Documents\ISOcoated_v2_300_eci.icc")); System.Drawing.Color rgbColor = System.Drawing.Color.FromArgb(color.R, color.G, color.B); 

请注意,使用来自两个不同名称空间的两个不同的Color类。 而且您可能需要添加PresentationCore DLL作为参考。

所需的颜色configuration文件可以从eci.org的下载部分下载。 它是包含多个configuration文件的更大的ZIP文件的一部分。 他们明确build议使用ISO涂层v2 300%(ECI)configuration文件。

如果您需要将完整的图像从CMYK转换为RGB,则在相同的命名空间中有特殊的类。

看看这个链接: http : //www.codeproject.com/KB/applications/xcmyk.aspx 。 它给出了这个公式。

 Black = minimum(1-Red,1-Green,1-Blue) Cyan = (1-Red-Black)/(1-Black) Magenta = (1-Green-Black)/(1-Black) Yellow = (1-Blue-Black)/(1-Black) 

我的完整示例C#之间转换CMYK < – >hex:

 public class ColorConverter { public static string CMYKtoHex(decimal[] cmyk) { if (cmyk.Length != 4) return null; var r = (int)(255 * (1 - cmyk[0]) * (1 - cmyk[3])); var g = (int)(255 * (1 - cmyk[1]) * (1 - cmyk[3])); var b = (int)(255 * (1 - cmyk[2]) * (1 - cmyk[3])); var hex = "#" + r.ToString("X2") + g.ToString("X2") + b.ToString("X2"); return hex; } public static decimal[] HexToCMYK(string hex) { decimal computedC = 0; decimal computedM = 0; decimal computedY = 0; decimal computedK = 0; hex = (hex[0] == '#') ? hex.Substring(1, 6) : hex; if (hex.Length != 6) { return null; } decimal r = int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); decimal g = int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); decimal b = int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); // BLACK if (r == 0 && g == 0 && b == 0) { computedK = 1; return new[] { 0, 0, 0, computedK }; } computedC = 1 - (r / 255); computedM = 1 - (g / 255); computedY = 1 - (b / 255); var minCMY = Math.Min(computedC, Math.Min(computedM, computedY)); computedC = (computedC - minCMY) / (1 - minCMY); computedM = (computedM - minCMY) / (1 - minCMY); computedY = (computedY - minCMY) / (1 - minCMY); computedK = minCMY; return new[] { computedC, computedM, computedY, computedK }; } } 

我认为Photoshop使用基于configuration文件的转换。 看看颜色选项的文档 。 如果是这种情况,您将无法将此行为与简单的基于公式的解决scheme相匹配。

我发现LCMS对于这种任务非常方便,简单和高效。我不知道是否有任何.net绑定…

我同意以前的答案,但我想说的是:

 if ( K == 1 ) { C = 0 M = 0 Y = 0 } 

这可以是如果r = g = b = 0。