微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

haskell – 将HSL转换为RBG

我正在尝试使用Data.Colour模块将一些HSL值转换为RBG. Hackage doc说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)
RGB {channelRed = 0,channelGreen = 0,channelBlue = 0}
it :: RGB Integer

这就是为什么我开始认为只有饱和度应该是[0,1]中的双精度.

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

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

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

λ> fmap truncate . (\(h,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}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。