9

我正在寻找一种将 RGB 颜色转换为 CMYK 的算法。Photoshop 正在执行以下转换:

R = 220 G = 233 B = 174

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

4

7 回答 7

10

从 RGB 到 CMYK 的转换取决于用于放置 CMYK 墨水的物理设备/过程。这些在软件中表示为颜色配置文件。 物理设备的ICCICM颜色配置文件决定了生成的颜色。

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

但是,如果您关心这方面,那么您需要使用Windows 颜色管理 APILittleCMS之类的工具为您进行颜色转换(因为它们在转换过程中应用了正确的颜色配置文件)。

于 2010-03-11T16:04:27.317 回答
8

查看此链接: 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) 
于 2010-03-11T15:57:44.753 回答
4

如果您想要好的结果,您需要应用颜色配置文件。在 .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);

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

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

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

于 2010-12-10T19:08:17.060 回答
3

我在 CMYK <-> HEX 之间进行 C# 转换的完整示例:

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 };
    }
 }
于 2014-05-12T08:35:56.807 回答
2

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

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

如果 r = g = b = 0,则可能是这样。

于 2014-03-04T17:09:27.583 回答
0

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

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

于 2012-10-05T19:26:15.717 回答
0

要将 RGB 转换为 CMYK,您可以使用ColorHelper库。

using ColorHelper;
RGB rgb = new RGB(220, 234, 174);
CMYK cmyk = ColorConverter.RgbToCmyk(rgb);

该库中的转换算法:

public static CMYK RgbToCmyk(RGB rgb)
{
    double modifiedR, modifiedG, modifiedB, c, m, y, k;

    modifiedR = rgb.R / 255.0;
    modifiedG = rgb.G / 255.0;
    modifiedB = rgb.B / 255.0;

    k = 1 - new List<double>() { modifiedR, modifiedG, modifiedB }.Max();
    c = (1 - modifiedR - k) / (1 - k);
    m = (1 - modifiedG - k) / (1 - k);
    y = (1 - modifiedB - k) / (1 - k);

    return new CMYK(
        (byte)Math.Round(c * 100),
        (byte)Math.Round(m * 100),
        (byte)Math.Round(y * 100),
        (byte)Math.Round(k * 100));
}

链接 - https://github.com/iamartyom/ColorHelper/blob/master/ColorHelper/Converter/ColorConverter.cs

于 2020-10-07T02:05:17.980 回答