質問
私はいくつかを変換しようとしています HSL
値 RBG
data.colourモジュール付き。 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
a 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
.
したがって、ドキュメントにその制約を追加すると役立つかもしれません。
所属していません StackOverflow