WPF将RGB转为HSL的工具类
class HSLColor
{
private int _alpha = 255;
public int _hue = 0;
public double _saturation = 1d;
public double _lightness = 1d;
//public double H;
//public double S;
//public double L;
public HSLColor()
{
}
public HSLColor(Color color)
{
_alpha = color.A;
FromRGB(color);
//double h = 0;
//double s = 0;
//double l = 0;
//RGB2HSL(color, out h, out s, out l);
//H = 255 * h;
//S = 255 * s;
//L = 255 * l;
}
private void FromRGB(Color color)
{
double r = ((double)color.R) / 255;
double g = ((double)color.G) / 255;
double b = ((double)color.B) / 255;
double min = Math.Min(Math.Min(r, g), b);
double max = Math.Max(Math.Max(r, g), b);
double distance = max – min;
_lightness = (max + min) / 2;
if (distance == 0)
{
_hue = 0;
_saturation = 0;
}
else
{
double hueTmp;
_saturation =
(_lightness < 0.5) ?
(distance / (max + min)) : (distance / ((2 – max) – min));
double tempR = (((max – r) / 6) + (distance / 2)) / distance;
double tempG = (((max – g) / 6) + (distance / 2)) / distance;
double tempB = (((max – b) / 6) + (distance / 2)) / distance;
if (r == max)
{
hueTmp = tempB – tempG;
}
else if (g == max)
{
hueTmp = (0.33333333333333331 + tempR) – tempB;
}
else
{
hueTmp = (0.66666666666666663 + tempG) – tempR;
}
if (hueTmp < 0)
{
hueTmp += 1;
}
if (hueTmp > 1)
{
hueTmp -= 1;
}
_hue = (int)(hueTmp * 250);
_saturation = _saturation * 240;
_lightness = _lightness * 200;
}
}
public static void RGB2HSL(Color rgb, out double h, out double s, out double l)
{
double r = rgb.R / 255.0;
double g = rgb.G / 255.0;
double b = rgb.B / 255.0;
double v;
double m;
double vm;
double r2, g2, b2;
h = 0; // default to black
s = 0;
l = 0;
v = Math.Max(r, g);
v = Math.Max(v, b);
m = Math.Min(r, g);
m = Math.Min(m, b);
l = (m + v) / 2.0;
if (l <= 0.0)
{
return;
}
vm = v – m;
s = vm;
if (s > 0.0)
{
s /= (l <= 0.5) ? (v + m) : (2.0 – v – m);
}
else
{
return;
}
r2 = (v – r) / vm;
g2 = (v – g) / vm;
b2 = (v – b) / vm;
if (r == v)
{
h = (g == m ? 5.0 + b2 : 1.0 – g2);
}
else if (g == v)
{
h = (b == m ? 1.0 + r2 : 3.0 – b2);
}
else
{
h = (r == m ? 3.0 + g2 : 5.0 – r2);
}
h /= 6.0;
}
}
|