【问题标题】:Why does hsl blue keep coming out as red when converted back to rgb?为什么在转换回 rgb 时,hsl blue 一直显示为红色?
【发布时间】:2014-10-16 00:31:22
【问题描述】:

我已经使用了许多“解决方案”,但似乎没有什么可以解决这个问题。目前,我正在使用 Newman 实现的 HslColor 类 (http://richnewman.wordpress.com/hslcolor-class/) 在颜色主题中进行一些颜色随机化。它大多工作得很好。但是在这个特定的场景中,一个蓝色的 HSL 值 (210,61,62) 进入了这个类,但是它的 RGB 值被计算为红色的 82,51,48。我尝试了许多将 HSL 转换回 RGB 的解决方案,但它们要么根本不起作用(导致溢出等),要么给我一个红色而不是蓝色。

我怀疑这可能是因为我的 Hue 是度数 (0-360) 并且所有算法都在期待别的东西(在他们的帖子中没有提到)。所以我尝试从这样的角度改变:

var h = Hue * (Math.PI / 180d);

但我得到了同样的东西。

就像我说的,我已经尝试了一些在 SO 上建议的解决方案。目前,我正在使用它来转换回 RGB:

[DllImport("shlwapi.dll")]
public static extern int ColorHLSToRGB(int h, int l, int s);

public string ToHexString()
{
    var h = Hue*(Math.PI/180.0d);
    var i = ColorHLSToRGB(Convert.ToInt32(h), Convert.ToInt32(Saturation),
        Convert.ToInt32(Luminosity));
    var c = ColorTranslator.FromWin32(i);

    return string.Format("#{0}{1}{2}", 
        c.R.ToString("X2"), 
        c.G.ToString("X2"), 
        c.B.ToString("X2"));
}

这似乎适用于大多数颜色,但这是一个不适用的特定场景。我确实考虑过浮点、双精度和整数(在解决方案之间)之间的分辨率损失,但除了遇到的溢出之外似乎没有什么不同。有什么想法吗?

【问题讨论】:

  • 以下是接受范围内的转换公式:easyrgb.com

标签: c# colors


【解决方案1】:

根据您引用的代码,在我看来,HSL 值应介于 0.0 和 240.0 之间。特别是,如果您传递 double 类型的值,您只会获得基于 HSL 的构造函数。如果您为构造函数传递整数,它会将其视为 RGB 颜色,而不是 HSL。看看 RGB 空间 (210,61,62) 中的红色阴影如何,这似乎与您的观察一致。

人们通常会期望您得到相同的 RGB 值。不幸的是,您没有发布与您所询问的问题相关的任何实际代码,因此我无法具体说明为什么您会看到您描述的确切行为。但可以肯定的是,就 HSLColor 类而言,您不能给它一个 HSL 值三元组 (210,61,62)。那是行不通的。

【讨论】:

  • 因此,您将看到的代码是我在原始帖子中使用 hsl 值创建 HSLColor 类的实例。然后调用我添加到类中的 ToHexStringMethod(对不起,我应该提到这一点)并得到红色而不是蓝色。所以让我问你这个问题,这个类期望色调的值是 0-1 是不是很奇怪?无论如何,我如何将我的学位值转换为预期值?听起来……像几何……弧度?
  • int 度数 = 210; double rangedZeroToOne = 度数 / 360.0;
  • 你知道他为什么将 HSL 值除以 240 吗?
  • 对不起,那是我的错误。我没有仔细看课程,也没有注意到面向公众的 API 实际上期望值介于 0 和 240 之间,而不是 0 和 1(我会相应地更新我的答案)。不过,我的原点是:如果您传递整数,您将获得 HSLColor 构造函数的 RGB 版本,而不是 HSL 版本。如果您想详细了解代码中可能出现的问题,则需要显示您正在使用的确切代码。
  • 抱歉,在我知道要发布什么代码来提供帮助之前,我正在尝试理解输入。所以0-240(蓝色光谱的中心?那是什么?我从.Net Color类中获取我的hsl值(例如myColor.GetHue(),myColor.GetSaturation()等),据我所知,色调是 0-360,饱和度和亮度是 0-1。考虑到这一点,我应该如何/如何传递这些值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多