/// <summary> /// Converts a Color from HSL to RGB /// See http://en.wikipedia.org/wiki/HSL_color_space#Conversion_from_HSL_to_RGB for details /// </summary> /// <param name="hsl"></param> /// <returns></returns> public static Microsoft.Xna.Framework.Color HSLtoRGB(ColorHSL hsl) { if (hsl.S == 0) return new Microsoft.Xna.Framework.Color(hsl.L, hsl.L, hsl.L); float temp1; float temp2; float Rtemp3, Gtemp3, Btemp3; float H; if (hsl.L < 0.5f) temp2 = hsl.L * (1.0f + hsl.S); else temp2 = hsl.L + hsl.S - hsl.L * hsl.S; temp1 = 2.0f * hsl.L - temp2; H = hsl.H / 360; Rtemp3 = H + 1.0f / 3.0f; Gtemp3 = H; Btemp3 = H - 1.0f / 3.0f; if (Rtemp3 < 0) Rtemp3 += 1.0f; if (Rtemp3 > 1) Rtemp3 -= 1.0f; if (Gtemp3 < 0) Gtemp3 += 1.0f; if (Gtemp3 > 1) Gtemp3 -= 1.0f; if (Btemp3 < 0) Btemp3 += 1.0f; if (Btemp3 > 1) Btemp3 -= 1.0f; float R, G, B; if ((6.0f * Rtemp3) < 1) R = temp1 + (temp2 - temp1) * 6.0f * Rtemp3; else if (2.0f * Rtemp3 < 1) R = temp2; else if (3.0f * Rtemp3 < 2) R = temp1 + (temp2 - temp1) * ((2.0f / 3.0f) - Rtemp3) * 6.0f; else R = temp1; if ((6.0f * Gtemp3) < 1) G = temp1 + (temp2 - temp1) * 6.0f * Gtemp3; else if (2.0f * Gtemp3 < 1) G = temp2; else if (3.0f * Gtemp3 < 2) G = temp1 + (temp2 - temp1) * ((2.0f / 3.0f) - Gtemp3) * 6.0f; else G = temp1; if ((6.0f * Btemp3) < 1) B = temp1 + (temp2 - temp1) * 6.0f * Btemp3; else if (2.0f * Btemp3 < 1) B = temp2; else if (3.0f * Btemp3 < 2) B = temp1 + (temp2 - temp1) * ((2.0f / 3.0f) - Btemp3) * 6.0f; else B = temp1; return new Microsoft.Xna.Framework.Color(R, G, B); }
/// <summary> /// Converts a Color from RGB to HSL /// See http://en.wikipedia.org/wiki/HSL_color_space#Conversion_from_RGB_to_HSL_or_HSV for details /// </summary> /// <param name="color"></param> /// <returns></returns> public static ColorHSL RGBtoHSL(Microsoft.Xna.Framework.Color color) { ColorHSL hsl = new ColorHSL(); float R = (float)color.R / (float)byte.MaxValue; float G = (float)color.G / (float)byte.MaxValue; float B = (float)color.B / (float)byte.MaxValue; float min = Math.Min(R, G); min = Math.Min(min, B); float max = Math.Max(R, G); max = Math.Max(max, B); hsl.L = (max + min) / 2; if (hsl.L < 0.5f) hsl.S = (max - min) / (max + min); else if (hsl.L >= 0.5f) hsl.S = (max - min) / (2.0f - max - min); if (max == min) hsl.S = 0; if (R == max) hsl.H = (G - B) / (max - min); else if (G == max) hsl.H = 2.0f + (B - R) / (max - min); else if (B == max) hsl.H = 4.0f + (R - G) / (max - min); hsl.H *= 360; return hsl; }