【发布时间】: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