2012-02-16 63 views
4

我试图用Data.Colour模块将一些HSL值转换为RBG。 Hackage doc说Hue总是在0-360的范围内。但是现在有任何范围的SaturationLightness值。它们是在[0,100]还是在[0,1]范围内?将HSL转换为RBG

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

λ> 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} 

(31,63,104)::RGB(214,54,26)::HSLsome online color-converters说。

我在做什么错?

+0

他们期望色调在[0..360]而不是IMO本身[0,2π[[。 – leftaroundabout 2012-02-17 10:07:24

回答

5

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

> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26 
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102} 
+0

最佳时机!但是真的不明显,返回的double值实际上是'RGB'。 – 2012-02-16 23:06:39

1

所以最后我想通了,既SaturationLightness值应在[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

因此,也许这将有助于在文档中添加该约束。

+1

包装维护人员是Russell O'Connor。他的电子邮件位于[包页面](http://hackage.haskell.org/package/colour),我相信他会很乐意让你丢失的文档报告并修复它。 – luqui 2012-02-16 23:05:21

+0

我已经通知他了。 – 2012-02-17 10:31:27