Domanda

Sto cercando di convertire un valore HSL a RBG con modulo Data.Colour. Hackage doc ha detto che Hue è sempre nel range 0-360. Ma ora ci sono tutti i campi di valori Saturation e Lightness. Sono in [0100] o in [0,1] gamme?

suppongo che prima variante è giusto, ma sembra che non lo è.

λ> hsl 100 50 50
RGB {channelRed = 866.6666666666692, channelGreen = -2400.0, channelBlue = 2500.0}

Che ho provato ad utilizzare nell'intervallo [0, 1] sia saturazione e luminosità.

λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ (0,0,0)
RGB {channelRed = 0, channelGreen = 0, channelBlue = 0}
it :: RGB Integer

Ecco perché sono iniziare a pensare che solo Saturation dovrebbe essere un Double in [0,1].

Per esempio abbiamo un certo valore del colore in formato HSL.

λ> let c = (34.0,0.54,68.0)
c :: (Double, Double, Double)

di noi convertirlo in RGB e troncare tutti i valori

λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ c
RGB {channelRed = 31, channelGreen = 63, channelBlue = 104}

Ma (31,63,104)::RGB è (214,54,26)::HSL come alcuni colori convertitori on-line detto.

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Sembra che il pacchetto utilizza la [0, 1] gamma sia per la leggerezza e la saturazione, ma nota che utilizza anche questa gamma per i valori RGB, e non [0, 255] come ti sembra di essere ammesso. Tenendo conto di questo, ho (quasi) i valori attesi:

> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}

Altri suggerimenti

Così alla fine ho capito che entrambi Saturation e il valore Lightness dovrebbero essere nella [0,1] gamma.

λ> 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

Fa un senso, perché il valore (217,179,129)::RGB è uguale a (34,54,68)::HSL.

Quindi, forse sarebbe utile aggiungere che vincola nella documentazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top