comment utiliser HSL dans Asp.net

Quels outils sont utilisés pour travailler avec les couleurs HSL dans .net?

0

3 Réponses

La structure de couleur fournit trois méthodes: GetHue, GetSaturation et GetBrightness.

Bob Powell a écrit un article intéressant à ce sujet il y a plusieurs années.

Note historique bizarre - "HSL" (et le "HSV" connexe) sont l'une des nombreuses choses provenant du Centre de recherche Palo Alto de Xerox (PARC) dans les années 70, avec l'aimable autorisation de Alvy Ray Smith .

0
ajouté
Merci Derek, je l'ai mis à jour avec un lien vers la copie de l'article de archive.org.
ajouté l'auteur Leon Bambrick, source
Le code de Bob Powell est en effet utile. Je l'ai depuis utilisé dans mes propres affaires et l'ai converti pour fournir des méthodes d'extension sur la classe System.Windows.Media.Color.
ajouté l'auteur Mal Ross, source
Le lien vers bobpowell.net/RGBHSB.htm est un lien mort
ajouté l'auteur Derek Tomes, source

En plus de la réponse de secretGeek, pour obtenir une couleur à partir des valeurs HSL (ou vice-versa), vous pouvez également utiliser ces appels de fonctions natives (exemple de code dans 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

(en utilisant ColorTranslator.ToWin32 et ColorTranslator.FromWin32 lors du passage / réception de l'argument / résultat de la couleur)

0
ajouté

Cette classe ColorRGB fournit des moyens d'obtenir et de définir HSL, ainsi que des conversions implicites vers et à partir de System.Drawing.Color. Il est basé sur un excellent exemple de 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();
      }
    }
  }
}
0
ajouté
Non, vous avez corrigé le blocage Alpha. Le problème est que Hue peut être 1.0, ce qui donne une valeur de sextant de 6, qui n'est pas gérée dans l'instruction case .
ajouté l'auteur Glenn Slayden, source
Votre FromHSLA ne gère pas le cas de h = 1.0.
ajouté l'auteur Don Reba, source
J'ai mis à jour le code; l'instruction switch gère maintenant h = 1.0
ajouté l'auteur Paul d'Aoust, source