質問

私はいくつかを変換しようとしています HSLRBG data.colourモジュール付き。 Hackage Docはそう言った Hue 常に0-360の範囲です。しかし、今では範囲があります SaturationLightness 値。それらは[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}

他のヒント

それで、ついに私はその両方を理解しました 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.

したがって、ドキュメントにその制約を追加すると役立つかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top