Манипулирование цветами в .NET – часть первая - Пространство цветов CMYK и YUV
ОГЛАВЛЕНИЕ
Пространство цветов CMYK
Пространство цветов CMYK, иначе именуемое CMJN, означает:
• Голубой (циан).
o Изменяется от 0 до 100% в большинстве приложений.
• Пурпурный (магента).
o Изменяется от 0 до 100% в большинстве приложений.
• Желтый.
o Изменяется от 0 до 100% в большинстве приложений.
• Черный.
o Изменяется от 0 до 100% в большинстве приложений.
Это вычитательная цветовая модель, используемая в цветной печати. CMYK работает по принципу оптической иллюзии, основанной на поглощении света.
Принцип заключается в наложении трех изображений; одного для циана, одного для магенты и одного для желтого; это воспроизводит цвета.
Ее типичным графическим представлением является следующее изображение:
Как цветовая модель RGB, CMYK является комбинацией основных цветов (циан, магента, желтый и черный). Это единственное сходство между ними.
CMYK страдает от нехватки оттенков цветов, что вызывает дыры в воспроизводимом ею спектре цветов. Поэтому часто наблюдаются различия при преобразовании цвета из CMYK в RGB.
Зачем использовать эту модель? Почему используется черный? Это служит практической цели. Википедия говорит:
• Чтобы повысить качество печати и уменьшить муаровые узоры,
• Текст обычно печатается черным и содержит мелкие детали (например, засечки); поэтому воспроизведение текста с помощью трех чернил требует сверхточной выверки для каждого трехкомпонентного изображения.
• Комбинация голубого, пурпурного и желтого пигментов не дает (или дает редко) чистый черный.
• Смешение всех трех цветных чернил для получения черного может намочить бумагу, если не используется сухой тонер. Это является проблемой при высокоскоростной печати, когда бумага должна высыхать крайне быстро, чтобы не остались пятна на следующем листе, и низкокачественная бумага типа газетной может порваться при слишком сильном намокании.
• Использование одного блока черных чернил вместо трех блоков триадной краски существенно снижает затраты (черные чернила часто дешевле).
Структура CMYK выглядит так:
/// <summary>
/// структура для определения CMYK.
/// </summary>
public struct CMYK
{
/// <summary>
/// получает пустую структуру CMYK;
/// </summary>
public readonly static CMYK Empty = new CMYK();
private double c;
private double m;
private double y;
private double k;
public static bool operator ==(CMYK item1, CMYK item2)
{
return (
item1.Cyan == item2.Cyan
&& item1.Magenta == item2.Magenta
&& item1.Yellow == item2.Yellow
&& item1.Black == item2.Black
);
}
public static bool operator !=(CMYK item1, CMYK item2)
{
return (
item1.Cyan != item2.Cyan
|| item1.Magenta != item2.Magenta
|| item1.Yellow != item2.Yellow
|| item1.Black != item2.Black
);
}
public double Cyan
{
get
{
return c;
}
set
{
c = value;
c = (c>1)? 1 : ((c<0)? 0 : c);
}
}
public double Magenta
{
get
{
return m;
}
set
{
m = value;
m = (m>1)? 1 : ((m<0)? 0 : m);
}
}
public double Yellow
{
get
{
return y;
}
set
{
y = value;
y = (y>1)? 1 : ((y<0)? 0 : y);
}
}
public double Black
{
get
{
return k;
}
set
{
k = value;
k = (k>1)? 1 : ((k<0)? 0 : k);
}
}
/// <summary>
/// создает экземпляр структуры CMYK.
/// </summary>
public CMYK(double c, double m, double y, double k)
{
this.c = c;
this.m = m;
this.y = y;
this.k = k;
}
public override bool Equals(Object obj)
{
if(obj==null || GetType()!=obj.GetType()) return false;
return (this == (CMYK)obj);
}
public override int GetHashCode()
{
return Cyan.GetHashCode() ^
Magenta.GetHashCode() ^ Yellow.GetHashCode() ^ Black.GetHashCode();
}
}
Пространство цветов YUV
Модель YUV определяет пространство цветов в виде одной компоненты яркости и двух компонент цветности. Цветовая модель YUV применяется в стандартах совмещенных цветов видео PAL, NTSC и SECAM.
YUV моделирует человеческое восприятие цвета точней, чем стандартная модель RGB, используемая в аппаратном обеспечении компьютерной графики.
Пространство цветов YUV означает:
• Y, компонент яркости.
o Изменяется от 0 до 100% в большинстве приложений.
• U и V – компоненты цветности (компоненты разностей синий-яркость и красный-яркость).
o Выражены в виде коэффициентов в зависимости от используемой версии YUV.
Графическим представлением является следующее изображение:
Структура YUV следующая:
/// <summary>
/// структура для определения YUV.
/// </summary>
public struct YUV
{
/// <summary>
/// получает пустую структуру YUV.
/// </summary>
public static readonly YUV Empty = new YUV();
private double y;
private double u;
private double v;
public static bool operator ==(YUV item1, YUV item2)
{
return (
item1.Y == item2.Y
&& item1.U == item2.U
&& item1.V == item2.V
);
}
public static bool operator !=(YUV item1, YUV item2)
{
return (
item1.Y != item2.Y
|| item1.U != item2.U
|| item1.V != item2.V
);
}
public double Y
{
get
{
return y;
}
set
{
y = value;
y = (y>1)? 1 : ((y<0)? 0 : y);
}
}
public double U
{
get
{
return u;
}
set
{
u = value;
u = (u>0.436)? 0.436 : ((u<-0.436)? -0.436 : u);
}
}
public double V
{
get
{
return v;
}
set
{
v = value;
v = (v>0.615)? 0.615 : ((v<-0.615)? -0.615 : v);
}
}
/// <summary>
/// создает экземпляр структуры YUV.
/// </summary>
public YUV(double y, double u, double v)
{
this.y = (y>1)? 1 : ((y<0)? 0 : y);
this.u = (u>0.436)? 0.436 : ((u<-0.436)? -0.436 : u);
this.v = (v>0.615)? 0.615 : ((v<-0.615)? -0.615 : v);
}
public override bool Equals(Object obj)
{
if(obj==null || GetType()!=obj.GetType()) return false;
return (this == (YUV)obj);
}
public override int GetHashCode()
{
return Y.GetHashCode() ^ U.GetHashCode() ^ V.GetHashCode();
}
}