如何在Asp.net中使用HSL

在.net中使用HSL颜色的工具有哪些?

0
额外 编辑
意见: 2

3 答案

颜色结构提供了三种方法:GetHue,GetSaturation和GetBrightness。

鲍勃鲍威尔写了有趣的一段几年前。

奇异的历史笔记 - “HSL”(以及相关的“HSV”)是源于施乐公司帕洛阿尔托研究中心(PARC)70年代的许多事情之一,由 Alvy Ray Smith

0
额外
感谢Derek,我通过链接到archive.org的文章副本对它进行了更新。
额外 作者 Leon Bambrick,
鲍勃鲍威尔的代码的确很方便。我已经使用它在我自己的东西,并将其转换为在System.Windows.Media.Color类提供扩展方法。
额外 作者 Mal Ross,
bobpowell.net/RGBHSB.htm 的链接是死链接
额外 作者 Derek Tomes,

除了secretGeek的回答,为了从HSL值中获取颜色(反之亦然),您还可以使用这些原生函数调用(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

(在传递/接收颜色参数/结果时使用 ColorTranslator.ToWin32ColorTranslator.FromWin32

0
额外

这个ColorRGB类提供了获取和设置HSL的方法,以及与System.Drawing.Color的隐式转换。它基于来自 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
额外
不,你修正了Alpha夹紧。问题在于Hue可以是1.0,它给出了六分仪的值,它不是在 case 语句中处理的。
额外 作者 Glenn Slayden,
您的FromHSLA不处理h = 1.0的情况。
额外 作者 Don Reba,
我更新了代码; switch语句现在处理h = 1.0
额外 作者 Paul d'Aoust,