Конвертировать цвет RGB в CMYK?
Я ищу алгоритм для преобразования цвета RGB в CMYK. Фотошоп выполняет преобразование ниже:
R = 220 G = 233 B = 174
C = 15 M = 0 Y = 40 K = 0
6 ответов
Преобразование из RGB в CMYK зависит от физического устройства / процесса, используемого для нанесения чернил CMYK. Они представлены в программном обеспечении как цветовые профили. Цветовые профили ICC и ICM физических устройств определяют результирующие цвета.
Если вас не интересует истинное представление на физическом устройстве, используйте формулы прямого преобразования в других публикациях.
Однако, если вас интересует этот аспект, то вам нужно использовать либо API-интерфейсы управления цветом Windows, либо что-то вроде LittleCMS, чтобы выполнить преобразования цветов за вас (поскольку они применяют надлежащий цветовой профиль во время преобразования).
Проверьте эту ссылку: 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)
Если вы хотите хороший результат, вам нужно применить цветовой профиль. В.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, для этого есть специальные классы в том же пространстве имен.
Мой полный пример преобразования 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 };
}
}
Я согласен с предыдущими ответами, но хочу сказать, что:
if ( K == 1 )
{
C = 0
M = 0
Y = 0
}
Это может быть, если r = g = b = 0.
Я думаю, что фотошоп использует конверсии на основе профиля. Посмотрите на документацию для вариантов цвета. Если это так, вы не сможете сопоставить это поведение с простыми решениями на основе формул.
Я обнаружил, что LCMS очень удобен, прост и эффективен для такого рода задач. Я не знаю, есть ли для него какая-либо привязка.net...
Для преобразования 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