C# 是否将RGB字节转换为HSL并返回?

C# 是否将RGB字节转换为HSL并返回?,c#,wpf,rgb,hsl,C#,Wpf,Rgb,Hsl,是否有将RGB字节数组转换为HSL浮点数组并再次转换的算法 我尝试了找到的那个,但它似乎有bug。我使用下面的类将HSL转换为RGB,反之亦然。您可以从Color构建ColorRGB实例,也可以简单地强制转换一个实例。它还公开了H,S,L属性。我在网上找到的。向原作者道歉,我找不到参考资料: public class ColorRGB { public byte R; public byte G; public byte B; public byte A;

是否有将RGB
字节
数组转换为HSL
浮点
数组并再次转换的算法


我尝试了找到的那个,但它似乎有bug。

我使用下面的类将HSL转换为RGB,反之亦然。您可以从
Color
构建
ColorRGB
实例,也可以简单地强制转换一个实例。它还公开了
H
S
L
属性。我在网上找到的。向原作者道歉,我找不到参考资料:

  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();
      }
    }
  }
公共类ColorRGB
{
公共字节R;
公共字节G;
公共字节B;
公共字节A;
公共颜色RGB()
{
R=255;
G=255;
B=255;
A=255;
}
公共颜色RGB(颜色值)
{
这个.R=值.R;
这个.G=值.G;
这个.B=值.B;
此.A=值.A;
}
公共静态隐式运算符颜色(ColorRGB rgb)
{
Color c=Color.FromArgb(rgb.A、rgb.R、rgb.G、rgb.B);
返回c;
}
公共静态显式运算符ColorRGB(颜色c)
{
返回新颜色RGB(c);
}
//给定0-1范围内的H、S、L
//返回0-255范围内的颜色(RGB结构)
HSL的公共静态颜色RGB(双H、双S、双L)
{
从HSLA返回(H、S、L、1.0);
}
//给定0-1范围内的H、S、L、A
//返回0-255范围内的颜色(RGB结构)
来自HSLA的公共静态颜色RGB(双H、双S、双L、双A)
{
双v;
双r,g,b;
如果(A>1.0)
A=1.0;
r=L;//默认为灰色
g=L;
b=L;
v=(l0)
{
双m;
双sv;
国际六分仪;
双分形,vsf,mid1,mid2;
m=L+L-v;
sv=(v-m)/v;
H*=6.0;
六分仪=(int)H;
fract=H-六分仪;
vsf=v*sv*fract;
mid1=m+vsf;
mid2=v-vsf;
开关(六分仪)
{
案例0:
r=v;
g=mid1;
b=m;
打破
案例1:
r=mid2;
g=v;
b=m;
打破
案例2:
r=m;
g=v;
b=mid1;
打破
案例3:
r=m;
g=mid2;
b=v;
打破
案例4:
r=mid1;
g=m;
b=v;
打破
案例5:
r=v;
g=m;
b=mid2;
打破
}
}
ColorRGB rgb=新的ColorRGB();
rgb.R=换算为单位字节(R*255.0f);
rgb.G=换算为单位字节(G*255.0f);
rgb.B=换算为单位字节(B*255.0f);
rgb.A=换算为单位字节(A*255.0f);
返回rgb;
}
//色调范围从0.0到1.0
公众浮标
{
得到
{
//使用System.Drawing.Color.GetHue,但除以360.0F
//因为System.Drawing.Color以度(0-360)为单位返回色调
//而不是一个介于0和1之间的数字。
返回((颜色)this.GetHue()/360.0F;
}
}
//0.0-1.0范围内的饱和度
公众浮标
{
得到
{
返回((颜色)this.GetSaturation();
}
}
//亮度范围为0.0-1.0
公众浮标
{
得到
{
返回((颜色)this.GetBrightness();
}
}
}
您可以为此使用库

从RGB到HSL:

using ColorHelper;
HSL hsl = ColorHeConverter.RgbToHsl(new RGB(10, 10, 10));
HSL至RGB:

using ColorHelper;
RGB rgb = ColorConverter.HslToRgb(new HSL(0, 0, 0));
链接:


我想我应该添加原始链接。:)谢谢-我在搜索代码时找不到它。很高兴我们现在可以将其归为原作者。这对我来说太聪明了;-)链接已断开,但在没有www的情况下可以工作:这对其他人有用吗?例如,对于H=0.95、S=1.0、V=1.0,它不会产生有意义的RGB输出。@Matt不是重复的,因为这个问题专门询问HSL,而您的链接指的是HSV。这不是一回事,没错,我的错。我删除了评论。