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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top