Манипулирование цветами в .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();
}

}
Читайте также:
  • Назад к основам – обобщенные структуры данных и алгоритмы в .NET 2.0
    •    Скачать исходники - 265.8 Кб (с тестами NUnit)•    Скачать двоичные файлы - 40.5 Кб•    Домашняя страница проекта NGenerics (CodePlex)Статья не дает все подробности и полные описания внутреннего устройства этих коллекций и алгоритмов - наоборот, она дает ссылки на имеющиеся в интернете ресурс...
  • Определение цен барьерных опционов с помощью сеток. Часть первая – постоянные барьеры
    •    Скачать демонстрационный проект - 5.26 Кб•    Скачать исходники - 12.2 Кб Введение Стоит отметить, что представленный метод можно расширить до вмещения опционов с несколькими постоянными барьерами. После изучения простого примера перейдем к более сложным опционам с изменяющимися во времени ...
  • FuzzyAdvisor – простая экспертная система с нечеткой логикой на F#
    •    Скачать исходники - 108 Кб Введение Более 15 лет назад разрабатывали проект (Brulé и др., 1995), требовавший экспертную систему, выбирающую подходящий вариант исходя из некоторых основных параметров. Были опробованы несколько подходов, в том числе использование исчисления предикатов (...
  • Нейронные сети на C#
    •    Скачать исходники - 251 Кб•    Скачать демонстрационный проект - 181 Кб Введение История нейронных сетей начинается в 1950-х гг., когда была представлена архитектура простейших нейронных сетей. После начальной работы в области идея нейронных сетей стала весьма популярной. Но затем область...
  • Генетические алгоритмы в задачах классификации искусственных нейронных сетей
    •    Скачать демо - 99.6 Кб•    Скачать исходники - 25.2 Кб Введение Природа предоставляет присущие ей методы для решения задач оптимизации, называемые генетическими алгоритмами. Живые организмы эволюционируют, адаптируются к меняющимся условиям, спариваются и производят индивидуумов, еще боле...