este problema se puede abordar de variadas formas, pero en este caso te enseñamos la que en nuestra opinión es la solución más completa.
Solución:
Esa función espera decimal para s
(saturación) y v
(valor), no porcentaje. Dividir por 100.
>>> import colorsys
# Using percent, incorrect
>>> test_color = colorsys.hsv_to_rgb(359,100,100)
>>> test_color
(100, -9900.0, -9900.0)
# Using decimal, correct
>>> test_color = colorsys.hsv_to_rgb(1,1,1)
>>> test_color
(1, 0.0, 0.0)
Si desea la tupla RGB no normalizada, aquí hay una función para envolver el colorsys
función.
def hsv2rgb(h,s,v):
return tuple(round(i * 255) for i in colorsys.hsv_to_rgb(h,s,v))
Funcionalidad de ejemplo
>>> hsv2rgb(0.5,0.5,0.5)
(64, 128, 128)
Si le gusta el rendimiento, es mejor evitar las importaciones y usar su propio código optimizado.
Aquí está el código exacto de colorsys ligeramente modificado para que el código de bytes sea un poco más rápido:
def hsv_to_rgb(h, s, v):
if s == 0.0: return (v, v, v)
i = int(h*6.) # XXX assume int() truncates!
f = (h*6.)-i; p,q,t = v*(1.-s), v*(1.-s*f), v*(1.-s*(1.-f)); i%=6
if i == 0: return (v, t, p)
if i == 1: return (q, v, p)
if i == 2: return (p, v, t)
if i == 3: return (p, q, v)
if i == 4: return (t, p, v)
if i == 5: return (v, p, q)
producción:
>>> hsv_to_rgb(359,1,1)
[1, 0.0, 0.0]
Usar una cadena if como la anterior es en realidad más rápido que usar elif
El uso de un contenedor, como en la respuesta de Cyber, requiere algunos pasos adicionales para que los realice el intérprete.
Para agregar, el ciclo for en el ejemplo de Cyber es un verdadero asesino del rendimiento cuando se usa así
Si desea un poco más de rendimiento, simplemente haga esto:
(No diré que este es el mejor rendimiento posible, pero ciertamente es mejor)
def hsv_to_rgb(h, s, v):
if s == 0.0: v*=255; return (v, v, v)
i = int(h*6.) # XXX assume int() truncates!
f = (h*6.)-i; p,q,t = int(255*(v*(1.-s))), int(255*(v*(1.-s*f))), int(255*(v*(1.-s*(1.-f)))); v*=255; i%=6
if i == 0: return (v, t, p)
if i == 1: return (q, v, p)
if i == 2: return (p, v, t)
if i == 3: return (p, q, v)
if i == 4: return (t, p, v)
if i == 5: return (v, p, q)
^ esto garantiza la salida int() con un rango de 255 (la entrada sigue siendo la misma)
>>> hsv_to_rgb(359./360.,1,1)
(255, 0, 0)
CONSEJO: manténgase alejado de terceros cuando sea posible, intente el enfoque directo si puede.
exclusiones: extensiones de C compiladas como PIL o NumPy, o envoltorios de ctypes como PyOpenGL (usa la DLL)
El argumento Hue también debe variar de 0-1.
import colorsys
test_color = colorsys.hsv_to_rgb(359/360.0, 1, 1)
Si estás de acuerdo, puedes dejar un enunciado acerca de qué te ha parecido esta crónica.