Question
Je suis en train de convertir une valeur de HSL
à RBG
avec le module Data.Colour. Hackage doc a dit que Hue
est toujours dans la gamme 0-360. Mais il y a maintenant des gammes de valeurs Saturation
et Lightness
. Sont-ils en [0100] ou dans [0,1] gammes?
Je suppose que la première variante est juste, mais il semble que ce n'est pas.
λ> hsl 100 50 50
RGB {channelRed = 866.6666666666692, channelGreen = -2400.0, channelBlue = 2500.0}
Que j'ai essayé d'utiliser la gamme [0, 1] pour les saturation et la luminosité.
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ (0,0,0)
RGB {channelRed = 0, channelGreen = 0, channelBlue = 0}
it :: RGB Integer
Ce pourquoi je suis commencer à penser que seul Saturation
devrait être un Double
dans [0,1]
.
Par exemple, nous avons une valeur de couleur au format HSL
.
λ> let c = (34.0,0.54,68.0)
c :: (Double, Double, Double)
Que nous convertir à RGB
et tronque toutes les valeurs
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ c
RGB {channelRed = 31, channelGreen = 63, channelBlue = 104}
Mais (31,63,104)::RGB
est (214,54,26)::HSL
comme certains convertisseurs couleur-ligne dit.
Qu'est-ce que je fais mal?
La solution
Il semble que le package utilise la [0, 1]
de gamme pour la légèreté et la saturation, mais notez qu'il utilise également cette plage pour les valeurs RVB, et non [0, 255]
que vous semblez assumer. En prenant cela en compte, je reçois (presque) les valeurs attendues:
> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
Autres conseils
Alors finalement j'ai compris que les deux Saturation
et la valeur Lightness
devrait être dans l'intervalle [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
Il est un sens, parce que la valeur de (217,179,129)::RGB
est égale à (34,54,68)::HSL
.
Alors, il serait peut-être utile d'ajouter que dans les docs contraintes.