我正在尝试使用Data.Colour模块将一些HSL值转换为RBG。Hackage文档说Hue总是在0-360范围内。但是现在有Saturation和Lightness值的任意范围。它们是在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应该是[0,1]中的Double。
例如,我们有一些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}但正如some online color-converters所说,(31,63,104)::RGB是(214,54,26)::HSL。
我做错了什么?
发布于 2012-02-17 06:57:40
看起来该软件包对亮度和饱和度都使用范围[0, 1],但请注意,它也对RGB值使用此范围,而不是您似乎假设的[0, 255]。考虑到这一点,我得到了(几乎)期望值:
> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}发布于 2012-02-17 06:58:23
所以最后我算出了Saturation和Lightness的值都应该在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)::RGB值等于(34,54,68)::HSL。
因此,在文档中添加该约束可能会有所帮助。
https://stackoverflow.com/questions/9320205
复制相似问题