如何在来回转换时保持RGB和HSL整数值一致?

时间:2017-08-02 22:21:34

标签: javascript c++ rgb photoshop hsl

我有将RGB值转换为HSL值以及将HSL转换为RGB的代码。 它工作正常,但是,我有一个可以在rgb或hsl中工作的颜色选择器。 问题是,它们都使用整数值..

因此,如果我将RGB转换为HSL,我会得到需要舍入的分数。当我转换回RGB时,这些值与它们相同 - 数字通常为1(在RGB> HSL> RGB之后,123的值可能变为124)。

我发现这很奇怪,因为在Photoshop中,它们具有相同的颜色选择器 - 您可以在RGB和HSB之间进行选择,并且当您来回转换时,RGB值保持一致,并且当您在两种模式中选择时它们使用整数值。 他们是如何做到的?

1 个答案:

答案 0 :(得分:1)

对于整数值,颜色空间的大小不同。

HSL有黑色(亮度为零),加上白色(亮度100),加上359 * 100 * 98其他颜色(因为色调零与色调360相同),使得3,518,202整数三倍。

RGB具有256 * 256 * 256或16,777,216个整数三元组,因此多个RGB值可以映射到相同的HSL值 - 约为4.7比1。

要在更改选取器模式时保持一致性,您可能需要在内部将HSL值保持为浮点值,但在选择器中显示整数值。在内部维护RGB值作为浮点也可能有所帮助。

我在彩色软件中看到的另一个问题是舍入从HSL到RGB转换得到的RGB值到0到25​​5范围内最接近的整数。我认为这是有问题的,因为它意味着rgb值1到254包含范围的1/255,而零和255只得到每个范围的1/255的一半。我更喜欢的替代方案是将浮点RGB分量值映射到256到255(如果你愿意,可以是255.99999),并获取结果颜色分量的整数层。这样,0到255的整数分量值得到每个范围的(1/256)。

在一天结束时,如果您希望用户能够输入之前使用的HSL值并获得完全相同的颜色,则需要允许带小数位的HSL值。