为什么hsl blue在转换回rgb时会以红色显示?

时间:2014-10-16 00:31:22

标签: c# colors

我使用了许多"解决方案"那里似乎没有什么可以解决这个问题。目前,我正在使用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"));
}

这似乎适用于大多数颜色,但这是一个特殊情况,它没有。我确实考虑了float,double和int(解决方案之间)之间的分辨率损失,但除了遇到的溢出之外,它似乎没有什么区别。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

根据您参考的代码,我认为HSL值的范围在0.0到240.0之间。特别是,如果传递double类型的值,则只获取基于HSL的构造函数。如果为构造函数传递int,则将其视为RGB颜色,而不是HSL。看看RGB空间(210,61,62)是如何呈红色,这与你的观察结果一致。

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