4

Data.Colourモジュールを使用してHSL値をに変換しようとしています。RBGHackage 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であるべきである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ようです。

私は何が間違っているのですか?

4

2 に答える 2

5

パッケージは[0, 1]明度と彩度の両方に範囲を使用しているように見え[0, 255]ますが、RGB 値にもこの範囲を使用していることに注意してください。これを考慮に入れると、(ほぼ)期待値が得られます。

> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
于 2012-02-16T22:57:39.587 に答える
1

最終的に、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ます。

そのため、ドキュメントにその制約を追加すると役立つ場合があります。

于 2012-02-16T22:58:22.620 に答える