Конвертировать цвет RGB в CMYK? - PullRequest
8 голосов
/ 11 марта 2010

Я ищу алгоритм для преобразования цвета RGB в CMYK. Photoshop выполняет преобразование ниже:

R = 220 G = 233 B = 174

С = 15 М = 0 Y = 40 К = 0

Ответы [ 6 ]

10 голосов
/ 11 марта 2010

Преобразование из RGB в CMYK зависит от физического устройства / процесса, используемого для нанесения чернил CMYK. Они представлены в программном обеспечении как цветовые профили. ICC и ICM Цветовые профили физических устройств определяют результирующие цвета.

Если вас не интересует истинное представление на физическом устройстве, используйте формулы прямого преобразования в других публикациях.

Если, однако, вас интересует этот аспект, то вам нужно использовать либо API управления цветом Windows , либо что-то вроде LittleCMS , чтобы выполнить преобразования цветов для вас поскольку они применяют правильный цветовой профиль во время преобразования).

5 голосов
/ 10 декабря 2010

Если вы хотите хороший результат, вам нужно применить цветовой профиль. В .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 из двух разных пространств имен. И, вероятно, вам нужно добавить DLL PresentationCore в качестве ссылки.

Необходимый цветовой профиль можно загрузить в разделе загрузок eci.org . Это часть большого ZIP-файла, содержащего несколько профилей. Они настоятельно рекомендуют использовать профиль ISO Coated v2 300% (ECI).

Если вам нужно преобразовать полный образ из CMYK в RGB, для этого есть специальные классы в одном и том же пространстве имен.

4 голосов
/ 11 марта 2010

Проверьте эту ссылку: 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) 
3 голосов
/ 12 мая 2014

Мой полный пример преобразования 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 };
    }
 }
0 голосов
/ 04 марта 2014

Я согласен с предыдущими ответами, но хочу сказать, что:

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

Может быть, если r = g = b = 0.

0 голосов
/ 05 октября 2012

Я думаю, что фотошоп использует конверсии на основе профиля. Посмотрите документацию для вариантов цвета . В таком случае вы не сможете сопоставить это поведение с простыми решениями на основе формул.

Я обнаружил, что LCMS очень удобна, проста и эффективна для такого рода задач. Я не знаю, есть ли для него привязка .net ...

...