public static HSLColor FromRGB(int r, int g, int b) { ExceptionUtils.ThrowIfNotInRange(r, 0, 255); ExceptionUtils.ThrowIfNotInRange(g, 0, 255); ExceptionUtils.ThrowIfNotInRange(b, 0, 255); double var_R = (r / 255.0); double var_G = (g / 255.0); double var_B = (b / 255.0); double var_Min = Math.Min(Math.Min(var_R, var_G), var_B); double var_Max = Math.Max(Math.Max(var_R, var_G), var_B); double del_Max = var_Max - var_Min; double L = (var_Max + var_Min) / 2.0; double H, S; if (del_Max == 0.0) { H = 0.0; S = 0.0; } else { if (L < 0.5) { S = del_Max / (var_Max + var_Min); } else { S = del_Max / (2.0 - var_Max - var_Min); } double del_R = (((var_Max - var_R) / 6.0) + (del_Max / 2.0)) / del_Max; double del_G = (((var_Max - var_G) / 6.0) + (del_Max / 2.0)) / del_Max; double del_B = (((var_Max - var_B) / 6.0) + (del_Max / 2.0)) / del_Max; if (var_R == var_Max) { H = del_B - del_G; } else if (var_G == var_Max) { H = (1.0 / 3.0) + del_R - del_B; } else // (var_B == var_Max) { H = (2.0 / 3.0) + del_G - del_R; } if (H < 0.0) { H += 1.0; } if (H > 1.0) { H -= 1.0; } } return(new HSLColor(H, S, L)); }