Ich muss (0, 128, 64) in so etwas wie # 008040 konvertieren. Ich bin mir nicht sicher, wie ich letzteres nennen soll, was die Suche schwierig macht.
Ich muss (0, 128, 64) in so etwas wie # 008040 konvertieren. Ich bin mir nicht sicher, wie ich letzteres nennen soll, was die Suche schwierig macht.
Antworten:
Verwenden Sie den Formatoperator %
:
>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'
Beachten Sie, dass keine Grenzen überprüft werden ...
>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'
'#%x%x%x' % (r, g, b)
def clamp(x):
return max(0, min(x, 255))
"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))
Dies verwendet die bevorzugte Methode zur Formatierung von Zeichenfolgen, wie in PEP 3101 beschrieben . Es verwendet auch min()
und max
um dies sicherzustellen 0 <= {r,g,b} <= 255
.
Update hat die Klemmfunktion wie unten vorgeschlagen hinzugefügt.
Aktualisierung Aus dem Titel der Frage und dem angegebenen Kontext sollte ersichtlich sein, dass dies 3 Ints in [0,255] erwartet und immer eine Farbe zurückgibt, wenn 3 solcher Ints übergeben werden. Aus den Kommentaren geht jedoch hervor, dass dies möglicherweise nicht für alle offensichtlich ist. Lassen Sie es daher ausdrücklich sagen:
Wenn drei
int
Werte angegeben werden, wird ein gültiges Hex-Triplett zurückgegeben, das eine Farbe darstellt. Wenn diese Werte zwischen [0,255] liegen, werden diese als RGB-Werte behandelt und die diesen Werten entsprechende Farbe zurückgegeben.
Dies ist eine alte Frage, aber zur Information habe ich ein Paket mit einigen Dienstprogrammen für Farben und Farbkarten entwickelt, das die Funktion rgb2hex enthält, mit der Sie Triplett in Hexa-Werte konvertieren wollten (die in vielen anderen Paketen enthalten ist, z. B. matplotlib). Es ist auf Pypi
pip install colormap
und dann
>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'
Die Gültigkeit der Eingänge wird überprüft (Werte müssen zwischen 0 und 255 liegen).
Ich habe ein vollständiges Python-Programm dafür erstellt. Die folgenden Funktionen können RGB in Hex konvertieren und umgekehrt.
def rgb2hex(r,g,b):
return "#{:02x}{:02x}{:02x}".format(r,g,b)
def hex2rgb(hexcode):
return tuple(map(ord,hexcode[1:].decode('hex')))
Den vollständigen Code und das Tutorial finden Sie unter folgendem Link: Konvertierung von RGB in Hex und Hex in RGB mit Python
triplet = (0, 128, 64)
print '#'+''.join(map(chr, triplet)).encode('hex')
oder
from struct import pack
print '#'+pack("BBB",*triplet).encode('hex')
python3 ist etwas anders
from base64 import b16encode
print(b'#'+b16encode(bytes(triplet)))
Beachten Sie, dass dies nur mit Python3.6 und höher funktioniert.
def rgb2hex(color):
"""Converts a list or tuple of color to an RGB string
Args:
color (list|tuple): the list or tuple of integers (e.g. (127, 127, 127))
Returns:
str: the rgb string
"""
return f"#{''.join(f'{hex(c)[2:].upper():0>2}' for c in color)}"
Das Obige ist das Äquivalent von:
def rgb2hex(color):
string = '#'
for value in color:
hex_string = hex(value) # e.g. 0x7f
reduced_hex_string = hex_string[2:] # e.g. 7f
capitalized_hex_string = reduced_hex_string.upper() # e.g. 7F
string += capitalized_hex_string # e.g. #7F7F7F
return string
Sie können Lambda und F-Strings verwenden (verfügbar in Python 3.6+).
rgb2hex = lambda r,g,b: f"#{r:02x}{g:02x}{b:02x}"
hex2rgb = lambda hx: (int(hx[0:2],16),int(hx[2:4],16),int(hx[4:6],16))
Verwendung
rgb2hex(r,g,b) #output = #hexcolor
hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)
background = RGB(0, 128, 64)
Ich weiß, dass Einzeiler in Python nicht unbedingt freundlich betrachtet werden. Aber es gibt Zeiten, in denen ich nicht widerstehen kann, die Vorteile des Python-Parsers zu nutzen. Es ist die gleiche Antwort wie Dietrich Epps Lösung (die beste), aber in einer einzigen Zeilenfunktion zusammengefasst. Also, danke Dietrich!
Ich benutze es jetzt mit tkinter :-)
Hier finden Sie eine umfassendere Funktion für die Behandlung von Situationen, in denen RGB-Werte im Bereich [0,1] oder im Bereich [0,255] liegen können .
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))
In Python 3.6 können Sie F-Strings verwenden , um dies sauberer zu machen:
rgb = (0,128, 64)
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}'
Natürlich können Sie das in eine Funktion einfügen , und als Bonus werden Werte gerundet und in int konvertiert :
def rgb2hex(r,g,b):
return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}'
rgb2hex(*rgb)
Sie können auch bitweise Operatoren verwenden, was ziemlich effizient ist, obwohl ich bezweifle, dass Sie sich bei so etwas Sorgen um die Effizienz machen würden. Es ist auch relativ sauber. Beachten Sie, dass die Grenzen nicht geklemmt oder überprüft werden. Dies wird seit mindestens Python 2.7.17 unterstützt .
hex(r << 16 | g << 8 | b)
Und um es so zu ändern, dass es mit einem # beginnt, können Sie Folgendes tun:
"#" + hex(243 << 16 | 103 << 8 | 67)[2:]
Ich bin wirklich überrascht, dass niemand diesen Ansatz vorgeschlagen hat:
Für Python 2 und 3:
'#' + ''.join('{:02X}'.format(i) for i in colortuple)
Python 3.6+:
'#' + ''.join(f'{i:02X}' for i in colortuple)
Als eine Funktion:
def hextriplet(colortuple):
return '#' + ''.join(f'{i:02X}' for i in colortuple)
color = (0, 128, 64)
print(hextriplet(color))
#008040
Es gibt ein Paket namens Webcolors. https://github.com/ubernostrum/webcolors
Es hat eine Methode webcolors.rgb_to_hex
>>> import webcolors
>>> webcolors.rgb_to_hex((12,232,23))
'#0ce817'