Преобразование HSL в RBG - PullRequest
4 голосов
/ 17 февраля 2012

Я пытаюсь преобразовать некоторое значение HSL в RBG с помощью модуля Data.Colour. Док Хакед сказал, что 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, как некоторые онлайн-конвертеры цветов сказал.

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 17 февраля 2012

Похоже, что пакет использует диапазон [0, 1] для яркости и насыщенности, но обратите внимание, что он также использует этот диапазон для значений RGB, а не [0, 255], как вы, вероятно, предполагаете. Принимая это во внимание, я получаю (почти) ожидаемые значения:

> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
1 голос
/ 17 февраля 2012

Итак, наконец, я понял, что значения 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.

Так что, возможно, было бы полезно добавить эти ограничения в документы.

...