HSV to RGB Color Conversion HSV to RGB Color Conversion python python

HSV to RGB Color Conversion


That function expects decimal for s (saturation) and v (value), not percent. Divide by 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)

If you would like the non-normalized RGB tuple, here is a function to wrap the colorsys function.

def hsv2rgb(h,s,v):    return tuple(round(i * 255) for i in colorsys.hsv_to_rgb(h,s,v))

Example functionality

>>> hsv2rgb(0.5,0.5,0.5)(64, 128, 128)


If you like performance, it's best to avoid imports and use your own optimized code

Here's the exact code from colorsys slightly modified to make the byte-code slightly faster:

    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)

output:

>>> hsv_to_rgb(359,1,1)[1, 0.0, 0.0]

Using an if-chain like above is actually faster than using elif

Using a wrapper, like in Cyber's answer, takes a few extra steps for the interpreter to perform.
To add, the for loop in Cyber's example is a real performance killer when used like that

If you want slightly more performance, simply do this:
(I won't say this is the best possible performance, but it's certainly better)

    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)

^ this guarantees int() output with a range of 255 (the input is still the same)

>>> hsv_to_rgb(359./360.,1,1)(255, 0, 0)

TIP: stay away from 3rd-party where possible, try the direct approach if you can.
exculusions: compiled C extensions such as PIL or NumPy, or ctypes wrappers such as PyOpenGL (uses the DLL)


The Hue argument should also vary from 0-1.

import colorsystest_color = colorsys.hsv_to_rgb(359/360.0, 1, 1)