Konvertierung von HSL in RBG
Frage
Ich versuche etwas zu konvertieren HSL
Wert zu RBG
mit Data.Colour -Modul. Hackage Doc sagte das Hue
ist immer im Bereich 0-360. Aber es gibt jetzt irgendwelche Bereiche von Saturation
und Lightness
Werte. Sind sie in [0,100] oder in [0,1] Bereichen?
Ich nehme an, diese erste Variante ist richtig, scheint es aber nicht.
λ> hsl 100 50 50
RGB {channelRed = 866.6666666666692, channelGreen = -2400.0, channelBlue = 2500.0}
Ich habe versucht, den Bereich [0, 1] für Sättigung und Leichtigkeit zu verwenden.
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ (0,0,0)
RGB {channelRed = 0, channelGreen = 0, channelBlue = 0}
it :: RGB Integer
Deshalb fange ich an, das nur zu überlegen Saturation
sollte a sein Double
in [0,1]
.
Zum Beispiel haben wir einen Farbwert in HSL
Format.
λ> let c = (34.0,0.54,68.0)
c :: (Double, Double, Double)
Als wir es in konvertieren RGB
und alle Werte abschneiden
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ c
RGB {channelRed = 31, channelGreen = 63, channelBlue = 104}
Aber (31,63,104)::RGB
ist (214,54,26)::HSL
wie Einige Online-Farbkonverter sagte.
Was mache ich falsch?
Lösung
Es sieht so aus, als ob das Paket den Bereich verwendet [0, 1]
sowohl für Leichtigkeit als auch für Sättigung, aber beachten Sie, dass er diesen Bereich auch für RGB -Werte verwendet und nicht [0, 255]
Wie Sie annehmen scheinen. Unter Berücksichtigung dessen bekomme ich (fast) die erwarteten Werte:
> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
Andere Tipps
Also habe ich das beide herausgefunden, dass beide Saturation
und Lightness
Der Wert sollte im Bereich [0,1] liegen.
λ> 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
Es macht einen Sinn, weil (217,179,129)::RGB
Wert ist gleich zu (34,54,68)::HSL
.
Vielleicht wäre es hilfreich, diese Einschränkungen in den Dokumenten hinzuzufügen.