在.net中使用哪些工具处理HSL颜色?

===============>>#1 票数:16 已采纳

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

鲍勃鲍威尔几年前写了一篇有趣的文章

奇怪的历史记录 - “HSL”(以及相关的“HSV”)是源于施乐公司70年代的Palo Alto研究中心(PARC)的众多事物之一,由Alvy Ray Smith提供

===============>>#2 票数:15

此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();
      }
    }
  }
}

===============>>#3 票数:7

除了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

  ask by Eric Haskins translate from so

未解决问题?本站智能推荐:

1回复

如何在C#中修改颜色亮度?

在c#中,您可以通过Color.GetBrightness()获得颜色的HSL亮度。 如果我想将颜色的亮度增加一定百分比,我不能简单地将各个RGB值乘以该数量。 似乎HSL不像那样工作。 我该怎么办?
19回复

HSL到RGB颜色转换[关闭]

我正在寻找一种工具或算法来将HSL颜色转换为RGB。 在我看来,HSL并没有被广泛使用,所以我没有太多运气寻找转换器。
2回复

将HSL转换为RBG

我正在尝试使用Data.Colour模块将一些HSL值转换为RBG 。 Hackage doc说Hue总是在0-360范围内。 但现在有Saturation和Lightness值的任何范围。 它们是在[0,100]还是在[0,1]范围内? 我认为第一个变体是正确的,但似乎不是。
3回复

RGB到HSL的转换

我正在创建一个拾色器工具,对于HSL滑块,我需要能够将RGB转换为HSL。 当我搜索SO以进行转换的方法时,我发现这个问题HSL到RGB颜色转换 。 虽然它提供了从RGB转换到HSL的功能,但我没有看到计算中实际发生的事情的解释。 为了更好地理解它,我在维基百科上阅读了HSL和HSV
1回复

HSL转换是否准确?

我还没有找到一个算法/实现,它可以将rgb(0, 96, 255)为HSL并返回,而不会以稍微不同的值( rgb(0, 98, 255) )结束。 这意味着每个人的算法都被破坏了(包括Wolfram | Alpha) - 或者HSL不能代表每种RGB颜色。 哪个是对的?
1回复

HSL到RGB的转换数学

从HSL转换为RGB时,涉及的数学似乎相对简单,尤其是在转换灰度时,因为RGB值是亮度乘以255。 但是,请使用此十六进制#eeeeee 。 它的RGB值是rgb(238,238,238) ,它的HSL表示形式是hsl(0.00, 0.00, 0.93) 。 我发现的每个对转换的引
3回复

RGB到HSL和返回,计算问题

我正在尝试将RGB转换为HSL,我也希望从HSL转换为RGB,我已经为它编写了一个类但是如果我做RGB-> HSL-> RGB来尝试它是否有效我会得到一个不同的值。 示例案例:如果通过执行HSLColor MyTestConversion = HSLColor.FromRGB(
1回复

在MySQL中将RGB转换为HSL

我正在尝试从数据库中获取HSL颜色值。 当前仅存储RGB值。 假设我为rgb设置了单独的列:红色,绿色,蓝色,每个数值均为0-255。 目标结果将是根据rgb值计算得出的结果集中的色相饱和度亮度。 我已经看过很多计算,但是似乎没有一个计算简单到可以在查询中完成? 或者,我一般对SQ
1回复

HSL到RGB颜色转换问题

我喜欢随机生成-​​和随机颜色-因此我决定将两者结合起来,制作了一个简单的2D景观生成器。 我的想法是,根据块的高度,(是的,地形是由块组成的)使它变亮或变暗,最靠近顶部的事物变亮,而靠近底部的事物变暗。 我知道它是在灰度下工作的,但是正如我发现的那样,鉴于RGB值之间的比率或任何类似的值似
2回复

颜色名称为RGB / Hex / HSL / HSV等

我遇到了这个很棒的功能/命令 。 颜色为RGB,您可以执行以下操作: 它将返回一个十六进制值。 我想使用Perl,Python或PHP扩展它,但是我希望能够传递例如“ yellow”,并且该函数返回所有类型的黄色-它们的hex / rgb /?/ etc值。 我已经实现了一个快