como usar o HSL no Asp.net

Quais ferramentas são usadas para trabalhar com colors HSL em .net?

A estrutura de colors fornece três methods: GetHue, GetSaturation e GetBrightness.

Bob Powell escreveu um artigo interessante sobre isso há vários anos.

Nota histórica bizarra – “HSL” (e o relacionado “HSV”) são uma das muitas coisas originárias do Centro de Pesquisas Palo Alto (PARC) da Xerox nos anos 70, cortesia de Alvy Ray Smith .

Essa class ColorRGB fornece maneiras de obter e definir HSL, juntamente com conversões implícitas de e para System.Drawing.Color. É baseado em um excelente exemplo do GeekMonkey.com .

using System; using System.Drawing; namespace RMA.Drawing { public class ColorRGB { public byte R; public byte G; public byte B; public byte A; public ColorRGB() { R = 255; G = 255; B = 255; A = 255; } public ColorRGB(Color value) { this.R = value.R; this.G = value.G; this.B = value.B; this.A = value.A; } public static implicit operator Color(ColorRGB rgb) { Color c = Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B); return c; } public static explicit operator ColorRGB(Color c) { return new ColorRGB(c); } // Given H,S,L in range of 0-1 // Returns a Color (RGB struct) in range of 0-255 public static ColorRGB FromHSL(double H, double S, double L) { return FromHSLA(H, S, L, 1.0); } // Given H,S,L,A in range of 0-1 // Returns a Color (RGB struct) in range of 0-255 public static ColorRGB FromHSLA(double H, double S, double L, double A) { double v; double r, g, b; if (A > 1.0) A = 1.0; r = L; // default to gray g = L; b = L; v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S); if (v > 0) { double m; double sv; int sextant; double fract, vsf, mid1, mid2; m = L + L - v; sv = (v - m) / v; H *= 6.0; sextant = (int)H; fract = H - sextant; vsf = v * sv * fract; mid1 = m + vsf; mid2 = v - vsf; switch (sextant) { case 0: r = v; g = mid1; b = m; break; case 1: r = mid2; g = v; b = m; break; case 2: r = m; g = v; b = mid1; break; case 3: r = m; g = mid2; b = v; break; case 4: r = mid1; g = m; b = v; break; case 5: r = v; g = m; b = mid2; break; } } ColorRGB rgb = new ColorRGB(); rgb.R = Convert.ToByte(r * 255.0f); rgb.G = Convert.ToByte(g * 255.0f); rgb.B = Convert.ToByte(b * 255.0f); rgb.A = Convert.ToByte(A * 255.0f); return rgb; } // Hue in range from 0.0 to 1.0 public float H { get { // Use System.Drawing.Color.GetHue, but divide by 360.0F // because System.Drawing.Color returns hue in degrees (0 - 360) // rather than a number between 0 and 1. return ((Color)this).GetHue() / 360.0F; } } // Saturation in range 0.0 - 1.0 public float S { get { return ((Color)this).GetSaturation(); } } // Lightness in range 0.0 - 1.0 public float L { get { return ((Color)this).GetBrightness(); } } } } 

Além da resposta da secretGeek, para obter uma cor dos valores HSL (ou vice-versa), você também pode usar essas chamadas de function nativas (código de exemplo no Visual Basic):

 Public Declare Sub ColorRGBToHLS Lib "shlwapi.dll" _ (ByVal clrRGB As UInteger, _ ByRef pwHue As Short, _ ByRef pwLuminance As Short, _ ByRef pwSaturation As Short) Public Declare Function ColorHLSToRGB Lib "shlwapi.dll" _ (ByVal wHue As Short, _ ByVal wLuminance As Short, _ ByVal wSaturation As Short) As UInteger 

(usando ColorTranslator.ToWin32 e ColorTranslator.FromWin32 ao passar / receber o argumento / resultado de cor)