Преобразование HSL в RBG
Вопрос
Я пытаюсь преобразовать некоторые HSL
ценность RBG
с Data.colour Module. Hackage Doc сказал, что 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
должен быть Double
в [0,1]
.
Например, у нас есть какое -то значение цвета в 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
как Некоторые онлайн-цветовые конвертеры сказал.
Что я делаю не так?
Решение
Похоже, в пакете используется диапазон [0, 1]
Как для легкого, так и для насыщения, но обратите внимание, что он также использует этот диапазон для значений RGB, а не [0, 255]
Как вы, кажется, предполагаете. Принимая это во внимание, я получаю (почти) ожидаемые значения:
> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
Другие советы
Итак, наконец я понял, что оба 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
.
Так что, возможно, было бы полезно добавить это ограничения в документах.