2010-03-11 9 views
8

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

R = 220 G = 233 В = 174

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

+0

Это, похоже, касается самого алгоритма; если вы просто хотите CMYK из RGB и не заботитесь о том, как это делается, просто используйте ImageMagick/Magick.Net, так как здесь задают и отвечают здесь: http: // stackoverflow.com/questions/10032335/how-can-i-convert-an-uploaded-image-of-rgb-format-to-cmyk-format-in-net –

ответ

4

проверить эту ссылку: 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) 
+0

Примечание: хотя преобразование приближается, большую часть времени он выиграл 't match photoshop. Сравнение сгенерированных цветов в фотошопе часто приводит к другим результатам. Прямого преобразования нет, но часто бывает достаточно близко. –

+0

. Код найден здесь по приведенной выше формуле: http://www.javascripter.net/faq/rgb2cmyk.htm –

+3

Также важно отметить, что приведенная выше формула предполагает, что красный, зеленый и синий были нормализованы (от 0,0 до 1,0). –

10

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

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

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

5

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

Обратите внимание, что два различных класса цвета из двух разных пространств имен используются. И вам, вероятно, нужно добавить DLL PresentationCore в качестве ссылки.

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

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

+0

Вопрос заключается в том, чтобы конвертировать из RGB в CMYK, а не наоборот. –

0

Я думаю, что фотошоп использует преобразования на основе профиля. Посмотрите на the documentation for the color options. Если это так, вы не сможете сопоставить это поведение с простыми решениями на основе формул.

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

0

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

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

Это может быть, если г = г = Ь = 0.

3

Мой полный пример для преобразования 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 }; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^