2010-08-01 11 views
39

Ho bisogno di convertire (0, 128, 64) in qualcosa del genere # 008040. Non sono sicuro di cosa chiamare quest'ultimo, rendendo difficile la ricerca.Conversione di una tupla di colori RGB in un codice a sei cifre, in Python

+0

Vedi prima SO rispondere http://stackoverflow.com/questions/214359/converting-hex-to-rgb-and-vice-versa of le tre risposte, quello con il maggior numero di voti include un snippet di codice python stand-alone per fare ciò che credo tu stia cercando. – doug

+0

Il termine che stai cercando è Hex Triplet. http://en.wikipedia.org/wiki/Hex_color#Hex_triplet –

risposta

79

Utilizzare l'operatore di formato %:

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

noti che non controllerà limiti ...

>>> '#%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)) 

Questo utilizza il metodo preferito di formattazione di stringhe, come described in PEP 3101. Utilizza anche min() e max per garantire che 0 <= {r,g,b} <= 255.

L'aggiornamento ha aggiunto la funzione di serraggio come suggerito di seguito.

Aggiornamento Dal titolo della domanda e dal contesto indicato, dovrebbe essere ovvio che ciò richiede 3 pollici in [0,255] e restituirà sempre un colore quando viene passato 3 di tali valori. Tuttavia, dai commenti, questo potrebbe non essere evidente a tutti, in modo da lasciarlo essere esplicitamente dichiarato:

fornito tre int valori, questo restituirà una tripletta esadecimale valida che rappresenta un colore. Se tali valori sono compresi tra [0,255], verranno trattati come valori RGB e restituiranno il colore corrispondente a tali valori.

+0

Un solo suggerimento: 'pinza def (x): return max (0, min (x, 255))' –

+0

Buon suggerimento. Grazie Marco, aggiornerò la soluzione. –

+0

@Jesse Dhillon: "clamping" == "fail in modo silenzioso". Prova qualcosa del tipo: 'se non (0 <= x <= 255): genera ValueError ('rgb (% r) non compreso nell'intervallo (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 è leggermente diverso

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

Questa è una vecchia questione, ma per informazioni, ho sviluppato un pacchetto con alcune utilità relative ai colori e mappe di colori e contiene la funzione rgb2hex che stavi cercando per convertire la tripletta in valore hexa (che può essere trovato in molti altri pacchetti, ad es. matplotlib). È sulla pypi

pip install colormap 

e poi

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

validità degli ingressi è selezionata (valori devono essere tra 0 e 255).

6

Ho creato un programma Python completo per esso le seguenti funzioni possono convertire rgb in esadecimale e 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'))) 

È possibile vedere il codice completo e un'esercitazione al seguente link: RGB to Hex and Hex to RGB conversion using Python

0

In Python 3.6, è possibile utilizzare F-stringhe per rendere questo più pulita:

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

Naturalmente si può mettere che in una funzione, e come bonus, valori ottenere arrotondata e convertito 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) 

so one-liner in Python non sono nece ssarily guardò gentilmente. Ma ci sono momenti in cui non riesco a resistere sfruttando ciò che il parser Python consente. È la stessa risposta della soluzione di Dietrich Epp (la migliore), ma racchiusa in una singola linea. Quindi, grazie Dietrich!

lo sto usando ora con tkinter :-)

0

Ecco una funzione più completa per le situazioni di gestione in cui si possono avere valori RGB nella gamma [0,1] o la gamma [ 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)) 
Problemi correlati