Pregunta
Estoy tratando de convertir algunos HSL
valor a RBG
con data.colour módulo. Hackage Doc dijo que Hue
está siempre en el rango 0-360. Pero ahora hay rangos de Saturation
y Lightness
valores. ¿Están en [0,100] o en rangos [0,1]?
Supongo que esa primera variante es correcta, pero parece que no lo es.
λ> hsl 100 50 50
RGB {channelRed = 866.6666666666692, channelGreen = -2400.0, channelBlue = 2500.0}
De lo que intenté usar el rango [0, 1] para saturación y ligereza.
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ (0,0,0)
RGB {channelRed = 0, channelGreen = 0, channelBlue = 0}
it :: RGB Integer
Por eso empiezo a pensar que solo Saturation
debería ser un Double
en [0,1]
.
Por ejemplo, tenemos algo de valor de color en HSL
formato.
λ> let c = (34.0,0.54,68.0)
c :: (Double, Double, Double)
De lo que lo convirtimos en RGB
y truncar todos los valores
λ> fmap truncate . (\(h,s,l) -> hsl h s l) $ c
RGB {channelRed = 31, channelGreen = 63, channelBlue = 104}
Pero (31,63,104)::RGB
es (214,54,26)::HSL
me gusta Algunos convertidores de colores en línea dijo.
¿Qué estoy haciendo mal?
Solución
Parece que el paquete usa la gama [0, 1]
tanto para ligereza como para saturación, pero tenga en cuenta que también usa este rango para valores RGB, y no [0, 255]
Como parece asumir. Teniendo esto en cuenta, obtengo (casi) los valores esperados:
> fmap (truncate . (* 255)) $ hsl 214 0.54 0.26
RGB {channelRed = 30, channelGreen = 61, channelBlue = 102}
Otros consejos
Así que finalmente he descubierto que ambos Saturation
y Lightness
El valor debe estar en el rango [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
Tiene sentido, porque (217,179,129)::RGB
el valor es igual a (34,54,68)::HSL
.
Entonces, tal vez sería útil agregar esas restricciones en los documentos.