Я ищу алгоритм для преобразования цвета RGB в CMYK. Photoshop выполняет преобразование ниже:Преобразование цвета RGB в CMYK?
R = 220 G = 233 В = 174
С = 15 М = 0 Y = 40 К = 0
Я ищу алгоритм для преобразования цвета RGB в CMYK. Photoshop выполняет преобразование ниже:Преобразование цвета RGB в CMYK?
R = 220 G = 233 В = 174
С = 15 М = 0 Y = 40 К = 0
проверить эту ссылку: 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)
Примечание: хотя преобразование приближается, большую часть времени он выиграл 't match photoshop. Сравнение сгенерированных цветов в фотошопе часто приводит к другим результатам. Прямого преобразования нет, но часто бывает достаточно близко. –
. Код найден здесь по приведенной выше формуле: http://www.javascripter.net/faq/rgb2cmyk.htm –
Также важно отметить, что приведенная выше формула предполагает, что красный, зеленый и синий были нормализованы (от 0,0 до 1,0). –
Преобразование из RGB в CMYK зависит от физического устройства/процесса используется для сложить CMYK чернила. Они представлены в программном обеспечении в виде цветовых профилей. ICC и ICM цветовые профили физических устройств определяют полученные цвета.
Если вас не интересует истинное представление на физическом устройстве, используйте формулы прямого преобразования в других сообщениях.
Если вы заинтересованы в этом аспекте, вам необходимо использовать либо Windows Color Management APIs, либо что-то вроде LittleCMS, чтобы сделать преобразования цвета для вас (поскольку они применяют правильный цветовой профиль во время преобразования).
Если вы хотите получить хороший результат, вам необходимо применить цветовой профиль. В .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, для этого в этом пространстве имен есть специальные классы.
Вопрос заключается в том, чтобы конвертировать из RGB в CMYK, а не наоборот. –
Я думаю, что фотошоп использует преобразования на основе профиля. Посмотрите на the documentation for the color options. Если это так, вы не сможете сопоставить это поведение с простыми решениями на основе формул.
Я нашел LCMS быть очень удобно, просто и эффективно для такого рода task.I не известно, есть ли .net обязательные для него ...
Я согласен с предыдущими ответами, но я хочу сказать, что:
if (K == 1)
{
C = 0
M = 0
Y = 0
}
Это может быть, если г = г = Ь = 0.
Мой полный пример для преобразования 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 };
}
}
Это, похоже, касается самого алгоритма; если вы просто хотите 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 –