El objetivo principal del modelo de color RGB (Rojo Verde Azul) es la detección, representación y visualización de imágenes en sistemas electrónicos, como televisores y computadoras.
HSL (Hue Saturation Lightness) es un modelo de color alternativo, diseñado en la década de 1970 por investigadores de gráficos por computadora para alinearse más estrechamente con la forma en que la visión humana percibe los atributos de creación de color
Aquí están los artículos wiki para RGB y HSL . Es común que los programas gráficos realicen los cálculos en HSL y luego los conviertan al formato preferido para la mayoría de las pantallas: RGB.
La tarea es escribir una función / programa que tome HSL como entrada y produzca RGB.
Puede elegir su representación preferida para E / S, siempre que sea coherente entre ellas.
Por ejemplo, pueden ser una matriz / tupla con 3 elementos o un objeto con 3 propiedades con nombre h
, s
y l
, pero voy a aceptar otras variaciones inteligentes, como la recepción de la hsl como un entero (precisión perder) y dar salida a un número entero rgb.
Se puede suponer que la entrada es segura en rango y formato, los cuales puede decidir. Sugiero encarecidamente los rangos 0-1 0-1 0-1
o 0-360 0-100 0-100
para hsl y / 0-1 0-1 0-1
o 0-255 0-255 0-255
para rgb.
Se requiere que cada respuesta especifique las dos anteriores y ponga varias variaciones en sus respuestas si está particularmente orgulloso de ellas, incluso si no tienen menos caracteres que sus otras variaciones. Pon el más pequeño encima.
Pseudo casos de prueba para 0-360 0-100 0-100
→0-255 0-255 0-255
h s l → r g b
0 0 0 → 0 0 0
90 56 17 → 43 68 19
202 19 39 → 81 104 118
72 55 26 → 88 103 30
Las fórmulas para la conversión se pueden encontrar aquí :
Esta es una buena manera de visualizar la conversión:
fuente
H
de0-360
es[0,360)
, ¿estaría mejor escrito como0-359
?a-b
notación es incorrecto en sí mismo cuando se trata de valores no enteros, pero diría que está bien mantener la pregunta más legible. Si alguien más se queja, lo repensaré, así que gracias por señalarlo[0,360)
entonces :)Respuestas:
JavaScript (ES6),
989594 bytesToma H en [0,360) y S / L en [0,1) . Salidas R , G y B como un conjunto de 3 flotadores en [0,1) .
Casos de prueba
Este fragmento convierte los resultados nuevamente en [0,255] .
Mostrar fragmento de código
¿Cómo?
Código de inicialización
Código principal
Permutaciones de (0, C, X)
La parte ligeramente complicada es generar la permutación correcta de (0, C, X) de acuerdo con el ángulo del componente de tono. Como se muestra en la siguiente figura, cada valor de columna se selecciona de la misma secuencia de ciclo del período 6 , comenzando en diferentes compensaciones. En el código anterior, estamos usando - ~ H en lugar de solo + H porque necesitamos forzar H a un número entero. De ahí las compensaciones (5,3,1) en lugar de (0,4,2) .
fuente
H
en[0,6)
y la salida de[0,1]
ahorrar algo de bytes?Mathematica, 155 bytes
Pruébalo en línea!
fuente
Hue
que HSB (AKA HSV) no HSL (ver las figuras 2a y 2b en la página de Wikipedia vinculada).RGBColor
existe peroHSLColor
no existe . > _>Python 2 , 32 bytes
Pruébalo en línea!
Esta funcionalidad está realmente integrada en Python a través del
hls_to_rgb
interior de lacolorsys
biblioteca. El formato de las entradas de mina es un rango 0-1 de HLS (en lugar de HSL, ambas son siglas comunes para la misma cosa [aunque, HSL es más común]). Y el mío genera valores RGB en una tupla con un rango de 0 a 1.Créditos
Gracias a Jonathan Allan por señalar que solo necesito importarlo (y luego ayudarme a reducir el conteo de bytes).
fuente
from colorsys import hls_to_rgb
ya que nos da una función que puede reutilizarse. Editar - haz que 21 comofrom colorsys import*
.import colorsys
por 15!C ++,
228221 bytes-7 bytes gracias a Zacharý
Los argumentos son ambas matrices que tienen un tamaño mínimo de 3 elementos (es decir,
float hsl[3]
yint rgb[3]
Bueno. Ahora, ¿cómo funciona eso? ¿Qué es ese largo conjunto?
Bueno, no es una matriz larga, es una
int
matriz. Broma a un lado, la matriz indica en cuántas posiciones desplazamos CX y 0 a la derecha cuando queremos seleccionar la permutación correcta, + 2. ¿Recuerdas cómo se seleccionan R ', G' y B '?Digamos que tenemos un orden "normal" que es {C, X, 0}
Ahora, cuando se selecciona la primera permutación (es decir, {C, X, 0}), no necesita desplazarse, que es exactamente lo mismo que el desplazamiento a la derecha en 0. Por lo tanto, los primeros 3 elementos de la matriz son 0,0 y 0 0
Para la segunda permutación ({X, C, 0}), necesitamos desplazar a la derecha C en 1 y desplazar a la izquierda X en -1, por lo que el cuarto, quinto y sexto elemento de la matriz son 1, -1 y 0
Y así...
Con el caso de la tercera y cuarta permutación, necesito desplazar a la izquierda el 0 por 2, por lo que el desplazamiento a la derecha por -2. Como hay más de 2 números que son negativos, prefiero agregar 2 a cada elemento en la matriz y restar 2 en el tiempo de ejecución (por razones de golf, para tener solo números enteros en la matriz).
fuente
Python 2 ,
119112 bytesPruébalo en línea!
Toma entrada como
H=[0,6[, S=[0,1], L=[0,1]
fuente
HTML + JavaScript (ES6), 8 + 88 = 96 bytes
Toma la entrada como un ángulo y dos porcentajes. Estoy puntuando el fragmento de HTML
<p id=p>
y la función de flecha de JavaScript. No sé qué utilizan los navegadores de redondeo, por lo que mis respuestas pueden diferir ligeramente de las suyas.fuente
Swift 4, 218 bytes
Acepta valores HSL en el rango [0,1] como argumentos, y devuelve una matriz que contiene los valores RGB en el mismo rango:
La idea es convertir primero la entrada de HSL a HSB, luego usar el constructor HSB del objeto de color incorporado en Cocoa para recuperar los valores RGB.
La versión UIKit tiene exactamente la misma longitud, ya que los únicos reemplazos son:
Cocoa
→UIKit
NSColor
→UIColor
Sin golf:
El siguiente fragmento puede ser utilizado para la prueba, por sólo la sustitución de los valores de
h
,s
yl
:Lamentablemente, no puedo proporcionar un enlace a un entorno limitado en línea, ya que todos se ejecutan en Linux, que no incluye Cocoa.
fuente
GLSL (GL_ES)
160 144 134131 bytesEl tono está en el rango 0-6 (ahorra 3 bytes)
Sat, light y rgb son 0-1
Pruébalo en el libro de sombreadores
Se utilizó la herramienta de selección de color en una pantalla de impresión para probar la salida correcta,
excepto un pequeño error en 202 19 39 → 81 104 118, que dio 80 104 118
fuente
R , 88 bytes
Pruébalo en línea!
Esta función toma como entrada los valores H, S y L como valores a distancia 0-1 y genera los valores RGB como valores a distancia 0-255. Convierte la representación HSL en una representación HSV, luego usa
hsv()
para convertir la representación HSV en un color R (es decir, representación hexadecimal - #rrggbb), luego usacol2rgb()
para convertir el color R a valores RGB.fuente
Jalea ,
3932 bytes-1 gracias a caird coinheringaahing (
%2
es soloḂ
)-1 y / o inspiración para -4 gracias a caird coinheringaahing también!
Un programa completo que toma tres argumentos de línea de comando:
L
,H
,S
En los intervalos[0,1)
,[0,6)
y[0,1)
respectivamenteque imprime una lista que da el formato RGB como
[R, G, B]
con cada uno de los tres valores en el rango[0,1]
Nota:
H
también puede envolver como lo[0,360)
haría.Pruébalo en línea!
¿Cómo?
fuente