Манипулирование цветами в .NET – часть первая - Преобразования HSB и HSL

ОГЛАВЛЕНИЕ

Преобразования HSB

a - HSB в RGB

Правило преобразования приведено ниже:

Эквивалент на C# следующий:

/// <summary>
/// преобразует HSB в RGB.
/// </summary>
public static RGB HSBtoRGB(double h, double s, double b)
{
double r = 0;
double g = 0;
double b = 0;

if(s == 0)
{
r = g = b = b;
}
else
{
// цветовой круг состоит из 6 секторов. Выяснить, в каком секторе
// находится.
double sectorPos = h / 60.0;
int sectorNumber = (int)(Math.Floor(sectorPos));
// получить дробную часть сектора
double fractionalSector = sectorPos - sectorNumber;

// вычислить значения для трех осей цвета.
double p = b * (1.0 - s);
double q = b * (1.0 - (s * fractionalSector));
double t = b * (1.0 - (s * (1 - fractionalSector)));

// присвоить дробные цвета r, g и b на основании сектора
// угол равняется.
switch(sectorNumber)
{
case 0:
r = b;
g = t;
b = p;
break;
case 1:
r = q;
g = b;
b = p;
break;
case 2:
r = p;
g = b;
b = t;
break;
case 3:
r = p;
g = q;
b = b;
break;
case 4:
r = t;
g = p;
b = b;
break;
case 5:
r = b;
g = p;
b = q;
break;
}
}

return new RGB(
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}", r*255.0)) ),
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}", g*255.0)) ),
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}", b*255.0)) )
);
}

b - HSB в HSL

Правило преобразования простое (но не точное): преобразовать в RGB, а затем в HSL.

/// <summary>
/// преобразует HSB в HSL.
/// </summary>
public static HSL HSBtoHSL(double h, double s, double b)
{
RGB rgb = HSBtoRGB(h, s, b);

return RGBtoHSL(rgb.Red, rgb.Green, rgb.Blue);
}

c - HSB в CMYK

Ничего нового: правило преобразования заключается в преобразовании в RGB, а затем в CMYK.

/// <summary>
/// преобразует HSB в CMYK.
/// </summary>
public static CMYK HSBtoCMYK(double h, double s, double b)
{
RGB rgb = HSBtoRGB(h, s, b);

return RGBtoCMYK(rgb.Red, rgb.Green, rgb.Blue);
}

d - HSB в YUV

Ничего нового: правило преобразования заключается в преобразовании в RGB, а затем в YUV.

/// <summary>
/// преобразует HSB в CMYK.
/// </summary>
public static YUV HSBtoYUV(double h, double s, double b)
{
RGB rgb = HSBtoRGB(h, s, b);

return RGBtoYUV(rgb.Red, rgb.Green, rgb.Blue);
}

Преобразования HSL

a - HSL в RGB

Правило преобразования приведено ниже:

Для каждого c = R,G,B:

Эквивалент на C# следующий:

/// <summary>
/// преобразует HSL в RGB.
/// </summary>
/// <param name="h">тон, должен быть в [0, 360].</param>
/// <param name="s">насыщенность, должна быть в [0, 1].</param>
/// <param name="l">яркость, должна быть в [0, 1].</param>
public static RGB HSLtoRGB(double h, double s, double l)
{
if(s == 0)
{
// ахроматический цвет (шкала серого)
return new RGB(
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}",
l*255.0)) ),
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}",
l*255.0)) ),
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}",
l*255.0)) )
);
}
else
{
double q = (l<0.5)?(l * (1.0+s)):(l+s - (l*s));
double p = (2.0 * l) - q;

double Hk = h/360.0;
double[] T = new double[3];
T[0] = Hk + (1.0/3.0); // Tr
T[1] = Hk; // Tb
T[2] = Hk - (1.0/3.0); // Tg

for(int i=0; i<3; i++)
{
if(T[i] < 0) T[i] += 1.0;
if(T[i] > 1) T[i] -= 1.0;

if((T[i]*6) < 1)
{
T[i] = p + ((q-p)*6.0*T[i]);
}
else if((T[i]*2.0) < 1) //(1.0/6.0)<=T[i] && T[i]<0.5
{
T[i] = q;
}
else if((T[i]*3.0) < 2) // 0.5<=T[i] && T[i]<(2.0/3.0)
{
T[i] = p + (q-p) * ((2.0/3.0) - T[i]) * 6.0;
}
else T[i] = p;
}

return new RGB(
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}",
T[0]*255.0)) ),
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}",
T[1]*255.0)) ),
Convert.ToInt32( Double.Parse(String.Format("{0:0.00}",
T[2]*255.0)) )
);
}
}

b - HSL в HSB

Ничего нового: правило преобразования заключается в преобразовании в RGB, а затем в HSB.

/// <summary>
/// преобразует HSL в HSB.
/// </summary>
public static HSB HSLtoHSB(double h, double s, double l)
{
RGB rgb = HSLtoRGB(h, s, l);

return RGBtoHSB(rgb.Red, rgb.Green, rgb.Blue);
}

c - HSL в CMYK

Ничего нового: правило преобразования заключается в преобразовании в RGB, а затем в CMYK.

/// <summary>
/// преобразует HSL в CMYK.
/// </summary>
public static CMYK HSLtoCMYK(double h, double s, double l)
{
RGB rgb = HSLtoRGB(h, s, l);

return RGBtoCMYK(rgb.Red, rgb.Green, rgb.Blue);
}

d - HSL в YUV

Ничего нового: правило преобразования заключается в преобразовании в RGB, а затем в CMYK.

/// <summary>
/// преобразует HSL в YUV.
/// </summary>
public static YUV HSLtoYUV(double h, double s, double l)
{
RGB rgb = HSLtoRGB(h, s, l);

return RGBtoYUV(rgb.Red, rgb.Green, rgb.Blue);
}