4

我正在尝试使用 Data.Colour 模块将一些HSL值转换为。RBGHackage doc 说Hue始终在 0-360 范围内。但是现在有任何范围SaturationLightness值。它们是在 [0,100] 还是 [0,1] 范围内?

我想第一个变体是正确的,但似乎不是。

λ> hsl 100 50 50
RGB {channelRed = 866.6666666666692, channelGreen = -2400.0, channelBlue = 2500.0}

比我尝试将范围 [0, 1] 用于饱和度和亮度。

λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ (0,0,0)
RGB {channelRed = 0, channelGreen = 0, channelBlue = 0}
it :: RGB Integer

这就是为什么我开始认为只Saturation应该是Doublein [0,1]

例如,我们在HSL格式中有一些颜色值。

λ> let c = (34.0,0.54,68.0)
c :: (Double, Double, Double)

比我们将其转换为RGB并截断所有值

λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ c
RGB {channelRed = 31, channelGreen = 63, channelBlue = 104}

(31,63,104)::RGB就像一些在线颜色转换器所说的(214,54,26)::HSL那样。

我究竟做错了什么?

4

2 回答 2

5

看起来该包使用[0, 1]亮度和饱和度的范围,但请注意,它也将此范围用于 RGB 值,而不是[0, 255]您似乎假设的那样。考虑到这一点,我得到(几乎)预期值:

> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
于 2012-02-16T22:57:39.587 回答
1

所以最后我发现SaturationLightnessvalue 都应该在 [0,1] 范围内。

λ> fmap (round . (255*)). (\(h,s,l) -> hsl h s l) $ (34.0,0.54,0.68)
RGB {channelRed = 217, channelGreen = 179, channelBlue = 129}
it :: RGB Integer

这是有道理的,因为(217,179,129)::RGBvalue 等于(34,54,68)::HSL

因此,也许在文档中添加这些约束会有所帮助。

于 2012-02-16T22:58:22.620 回答