public static double[] RGB2HSL(double R, double G, double B)
{
R = R < 0.0 ? 0.0 : R > 255.0 ? 1.0 : R / 255.0;
G = G < 0.0 ? 0.0 : G > 255.0 ? 1.0 : G / 255.0;
B = B < 0.0 ? 0.0 : B > 255.0 ? 1.0 : B / 255.0;
double M = System.Math.Max(R, System.Math.Max(G, B));
double m = System.Math.Min(R, System.Math.Min(G, B));
double C = M - m;
double H = 0.0, S, L;
if (C == 0) H = 0.0;
else if (M == R) H = ((G - B) / C) % 6.0;
else if (M == G) H = ((B - R) / C) + 2.0;
else if (M == B) H = ((R - G) / C) + 4.0;
H *= 60.0;
while (H < 0.0) H += 360.0;
while (H > 360.0) H -= 360.0;
H = H % 360.0;
L = (M + m) / 2.0;
S = (C == 0 || L == 1) ? 0.0 : C / (1.0 - System.Math.Abs(2.0 * L - 1.0));
return new double[] { H, S, L };
}