为什么hsl蓝色在转换回rgb时一直显示为红色

本文关键字:一直 显示 红色 rgb hsl 蓝色 转换 为什么 | 更新日期: 2023-09-27 18:26:36

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

我怀疑这可能是因为我的色调是以度(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(解决方案之间)之间的分辨率损失,但除了遇到溢出之外,这似乎没有什么区别。有什么想法吗?

为什么hsl蓝色在转换回rgb时一直显示为红色

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

通常情况下,你会得到相同的RGB值。不幸的是,你没有发布任何与你所问的问题相关的实际代码,所以我不能具体说明你为什么会看到你所描述的确切行为。但可以肯定的是,就HSLColor类而言,你不能给它一个HSL值的三元组(210,61,62)。这根本不起作用。