我正在尝试使用 Data.Colour 模块将一些 HSL
值转换为 RBG
。 Hackage 文档说 Hue
始终在 0-360 范围内。但现在有任意范围的饱和度
和亮度
值。它们是在 [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
这就是为什么我开始认为 [0,1]
中只有 Saturation
应该是 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}
但是 (31,63,104)::RGB
是 (214,54,26)::HSL
就像 some online color-converters说。
我做错了什么?
最佳答案
看起来该包使用范围 [0, 1]
来表示亮度和饱和度,但请注意,它也使用此范围来表示 RGB 值,而不是 [0, 255 ]
正如您所假设的那样。考虑到这一点,我得到了(几乎)预期值:
> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
关于haskell - 将 HSL 转换为 RGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9320205/