Манипулирование цветами в .NET – часть первая - I – Цветовые модели. RGB

ОГЛАВЛЕНИЕ

I – Цветовые модели

RGB (красный, зелёный, синий)

Цветовая модель RGB (красный, зеленый, синий) является наиболее известной и самой используемой повседневно. Она определяет пространство цветов в виде трех компонентов:
Красный – в диапазоне 0-255
Зеленый – в диапазоне 0-255
Синий – в диапазоне 0-255

Цветовая модель RGB является суммируемой, то есть значения красного, зеленого и синего (называемые тремя основными цветами) комбинируются для воспроизводства других цветов.

Например, цвет "красный" представляется как [R=255, G=0, B=0], "фиолетовый" как [R=238, G=130, B=238] и т. д.

Ее типичным графическим представлением является следующее изображение:

В .NET структура Color использует эту модель для обеспечения поддержки цвета посредством свойств R, G и B.

Console.WriteLine(String.Format("R={0}, G={1}, B={2}",
Color.Red.R, Color.Red.G, Color.Red.B);
Console.WriteLine(String.Format("R={0}, G={1}, B={2}",
Color.Cyan.R, Color.Cyan.G, Color.Cyan.B);
Console.WriteLine(String.Format("R={0}, G={1}, B={2}",
Color.White.R, Color.White.G, Color.White.B);
Console.WriteLine(String.Format("R={0}, G={1}, B={2}",
Color.SteelBlue.R, Color.SteelBlue.G, Color.SteelBlue.B);

// и т.д.

но это не единственное ее применение. Поэтому можно определить специальную структуру RGB для дальнейшего кодирования, как показано ниже:

/// <summary>
/// структура RGB.
/// </summary>
public struct RGB
{
/// <summary>
/// получает пустую структуру RGB;
/// </summary>
public static readonly RGB Empty = new RGB();

private int red;
private int green;
private int blue;

public static bool operator ==(RGB item1, RGB item2)
{
return (
item1.Red == item2.Red
&& item1.Green == item2.Green
&& item1.Blue == item2.Blue
);
}

public static bool operator !=(RGB item1, RGB item2)
{
return (
item1.Red != item2.Red
|| item1.Green != item2.Green
|| item1.Blue != item2.Blue
);
}

/// <summary>
/// получает или устанавливает значение красного.
/// </summary>
public int Red
{
get
{
return red;
}
set
{
red = (value>255)? 255 : ((value<0)?0 : value);
}
}

/// <summary>
/// получает или устанавливает значение зеленого.
/// </summary>
public int Green
{
get
{
return green;
}
set
{
green = (value>255)? 255 : ((value<0)?0 : value);
}
}

/// <summary>
/// получает или устанавливает значение синего.
/// </summary>
public int Blue
{
get
{
return blue;
}
set
{
blue = (value>255)? 255 : ((value<0)?0 : value);
}
}

public RGB(int R, int G, int B)
{
this.red = (R>255)? 255 : ((R<0)?0 : R);
this.green = (G>255)? 255 : ((G<0)?0 : G);
this.blue = (B>255)? 255 : ((B<0)?0 : B);
}

public override bool Equals(Object obj)
{
if(obj==null || GetType()!=obj.GetType()) return false;

return (this == (RGB)obj);
}

public override int GetHashCode()
{
return Red.GetHashCode() ^ Green.GetHashCode() ^ Blue.GetHashCode();
}
}