2010-08-01 19 views
39

Necesito convertir (0, 128, 64) a algo así como # 008040. No estoy seguro de cómo llamar a este último, lo que dificulta la búsqueda.Convertir una tupla de color RGB a un código de seis dígitos, en Python

+0

Ver respuesta para antes http://stackoverflow.com/questions/214359/converting-hex-to-rgb-and-vice-versa --de las tres respuestas, el que tiene la mayoría de votos incluye una fragmento de código python para hacer lo que creo que está buscando. – doug

+0

El término que estás buscando es Hex Triplet. http://en.wikipedia.org/wiki/Hex_color#Hex_triplet –

Respuesta

79

usar el operador de formato %:

>>> '#%02x%02x%02x' % (0, 128, 64) 
'#008040' 

Tenga en cuenta que no va a revisar los límites ...

>>> '#%02x%02x%02x' % (0, -1, 9999) 
'#00-1270f' 
33
def clamp(x): 
    return max(0, min(x, 255)) 

"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b)) 

Esto utiliza el método preferido de formato de cadenas, como described in PEP 3101. También usa min() y max para asegurar que 0 <= {r,g,b} <= 255.

La actualización agregó la función de pinza como se sugiere a continuación.

actualización Desde el título de la pregunta y el contexto dado, debe ser obvio que esta espera 3 enteros en [0255] y siempre devolverá un color cuando está pasado 3 de tales enteros. Sin embargo, a partir de los comentarios, esto puede no ser evidente para todos, por lo que dejar que se afirma explícitamente:

proporcionan tres valores int, esto va a devolver un triplete hexadecimal válido que representa un color. Si esos valores están entre [0,255], los tratará como valores RGB y devolverá el color correspondiente a esos valores.

+0

Solo una sugerencia: 'def clamp (x): return max (0, min (x, 255))' –

+0

Buena sugerencia. Gracias Mark, actualizaré la solución. –

+0

@Jesse Dhillon: "sujeción" == "falla silenciosa". Pruebe algo como esto: 'if not (0 <= x <= 255): raise ValueError ('rgb (% r) no en rango (256)'% x)' –

7
triplet = (0, 128, 64) 
print '#'+''.join(map(chr, triplet)).encode('hex') 

o

from struct import pack 
print '#'+pack("BBB",*triplet).encode('hex') 

python3 es ligeramente diferente

from base64 import b16encode 
print(b'#'+b16encode(bytes(triplet))) 
11

Ésta es una cuestión de edad, sino de información, he desarrollado un paquete con algunas empresas de servicios relacionados con los colores y mapas de colores y contiene la función rgb2hex que buscaba convertir triplete en valor hexa (que se puede encontrar en muchos otros paquetes, p. matplotlib). Está en PyPI

pip install colormap 

y luego se comprueba

>>> from colormap import rgb2hex 
>>> rgb2hex(0, 128, 64) 
'##008040' 

Validez de las entradas (valores deben estar entre 0 y 255).

6

He creado un programa completo de python para que las siguientes funciones puedan convertir rgb en hexadecimal y viceversa.

def rgb2hex(r,g,b): 
    return "#{:02x}{:02x}{:02x}".format(r,g,b) 

def hex2rgb(hexcode): 
    return tuple(map(ord,hexcode[1:].decode('hex'))) 

Se puede ver el código completo y un tutorial en el siguiente enlace: RGB to Hex and Hex to RGB conversion using Python

0

En Python 3.6, puede utilizar f-cuerdas para hacer este limpiador:

rgb = (0,128, 64) 
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}' 

por supuesto se puede poner esto en una función, y como un bono, valores conseguir redondeado y convertido a int:

def rgb2hex(r,g,b): 
    return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}' 

rgb2hex(*rgb) 
0
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue) 

background = RGB(0, 128, 64) 

yo sé de una sola línea en Python no son nece ssarily miró amablemente. Pero hay momentos en los que no puedo resistirme a aprovechar lo que el analizador de Python permite. Es la misma respuesta que la solución de Dietrich Epp (la mejor), pero envuelta en una sola función de línea. Entonces, ¡gracias Dietrich!

lo estoy usando ahora con tkinter :-)

0

Aquí es una función más completa para el manejo de situaciones en las que puede tener valores RGB en el rango [0,1] o el rango [ 0,255].

def RGBtoHex(vals, rgbtype=1): 
    """Converts RGB values in a variety of formats to Hex values. 

    @param vals  An RGB/RGBA tuple 
    @param rgbtype Valid valus are: 
          1 - Inputs are in the range 0 to 1 
         256 - Inputs are in the range 0 to 255 

    @return A hex string in the form '#RRGGBB' or '#RRGGBBAA' 
""" 

    if len(vals)!=3 and len(vals)!=4: 
    raise Exception("RGB or RGBA inputs to RGBtoHex must have three or four elements!") 
    if rgbtype!=1 and rgbtype!=256: 
    raise Exception("rgbtype must be 1 or 256!") 

    #Convert from 0-1 RGB/RGBA to 0-255 RGB/RGBA 
    if rgbtype==1: 
    vals = [255*x for x in vals] 

    #Ensure values are rounded integers, convert to hex, and concatenate 
    return '#' + ''.join(['{:02X}'.format(int(round(x))) for x in vals]) 

print(RGBtoHex((0.1,0.3, 1))) 
print(RGBtoHex((0.8,0.5, 0))) 
print(RGBtoHex(( 3, 20,147), rgbtype=256)) 
print(RGBtoHex(( 3, 20,147,43), rgbtype=256)) 
Cuestiones relacionadas