Zobacz wcześniejszą odpowiedź SO stackoverflow.com/questions/214359/ ... - z trzech odpowiedzi, ta z największą liczbą głosów zawiera fragment kodu w języku Python, który pozwala robić to, o co myślę.
Czy jednak 2-cyfrowy limit jest naprawdę konieczny? Dopóki wartości RGB mieszczą się w odpowiednich granicach 0-255, nie powinieneś tego potrzebować. Możesz więc po prostu zrobić'#%x%x%x' % (r, g, b)
słowa
3
Właściwie teraz widzę, że jeśli masz wartość 0, należy ją uzupełnić innym zerem. Zatem 02, aby uzyskać dwie cyfry.
Wykorzystuje preferowaną metodę formatowania ciągów, zgodnie z opisem w PEP 3101 . Używa również min()i maxzapewnia to 0 <= {r,g,b} <= 255.
Aktualizacja dodała funkcję zacisku zgodnie z sugestią poniżej.
Aktualizacja Z tytułu pytania i podanego kontekstu powinno być oczywiste, że oczekuje to 3 intów w [0,255] i zawsze zwróci kolor po przekazaniu 3 takich int. Jednak z komentarzy może to nie być oczywiste dla wszystkich, więc powiedzmy wprost:
Podanie trzech intwartości zwróci prawidłową trójkę szesnastkową reprezentującą kolor. Jeśli te wartości mieszczą się w przedziale [0,255], potraktuje je jako wartości RGB i zwróci kolor odpowiadający tym wartościom.
To jest stare pytanie, ale dla informacji opracowałem pakiet z kilkoma narzędziami związanymi z kolorami i mapami kolorów oraz zawiera funkcję rgb2hex, którą chciałeś przekonwertować triplet na wartość heksa (którą można znaleźć w wielu innych pakietach, np. Matplotlib). Jest na pypi
pip install colormap
i wtedy
>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'
Sprawdzana jest ważność wejść (wartości muszą zawierać się w przedziale od 0 do 255).
Zauważ, że działa to tylko z pythonem 3.6 i nowszymi.
defrgb2hex(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
"""returnf"#{''.join(f'{hex(c)[2:].upper():0>2}'for c in color)}"
Powyższe jest odpowiednikiem:
defrgb2hex(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. #7F7F7Freturn string
Ta funkcja rgb2hex, zastosowana do (13,13,12), daje 0xDDC, ale strona RGB na HEX podaje ją jako 0x0D0D0C, co również zgadza się z ideą, że liczba powinna wynosić 13 * 65536 + 13 * 256 + 12, a 0xDDC jest odczytywane przez Pythona jako 3548.
Lars Ericson
Kolory CSS są niespójne. Istnieją 6-cyfrowe kolory szesnastkowe, 3-cyfrowe kolory szesnastkowe, notacja rgb z liczbami dziesiętnymi i procentami, hsl itp. Poprawiłem formułę, aby zawsze zapewniała 6-cyfrowe kolory szesnastkowe i chociaż myślę, że może być bardziej spójny, ja Nie jestem pewien, czy jest bardziej poprawne.
Brian Bruggeman
3
możesz użyć lambda i f-stringów (dostępne w Pythonie 3.6+)
Bezpośrednie wywoływanie lambda nie jest zalecane z wielu powodów. Użyłem ich w ten sposób w projekcie, który był recenzowany i wszyscy mówili to samo, nie dzwoniąc bezpośrednio.
Wiem, że jednolinijkowe w Pythonie niekoniecznie są mile widziane. Ale są chwile, kiedy nie mogę się powstrzymać przed skorzystaniem z tego, na co pozwala parser Pythona. To ta sama odpowiedź, co rozwiązanie Dietricha Eppa (najlepsze), ale zawarte w jednej funkcji liniowej. Więc dziękuję Dietrich!
Oto bardziej kompletna funkcja do obsługi sytuacji, w których możesz mieć wartości RGB z zakresu [0,1] lub zakresu [0,255] .
defRGBtoHex(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)!=3and len(vals)!=4:
raise Exception("RGB or RGBA inputs to RGBtoHex must have three or four elements!")
if rgbtype!=1and rgbtype!=256:
raise Exception("rgbtype must be 1 or 256!")
#Convert from 0-1 RGB/RGBA to 0-255 RGB/RGBAif rgbtype==1:
vals = [255*x for x in vals]
#Ensure values are rounded integers, convert to hex, and concatenatereturn'#' + ''.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))
Możesz także używać bitowych operatorów, co jest dość wydajne, chociaż wątpię, czy martwiłbyś się o wydajność w przypadku czegoś takiego. Jest też stosunkowo czysty. Zauważ, że nie zaciska ani nie sprawdza granic. Jest to obsługiwane co najmniej od wersji Python 2.7.17 .
hex(r << 16 | g << 8 | b)
Aby to zmienić, aby zaczynało się od #, możesz to zrobić:
Odpowiedzi:
Użyj operatora formatu
%
:>>> '#%02x%02x%02x' % (0, 128, 64) '#008040'
Zauważ, że nie sprawdzi granic ...
>>> '#%02x%02x%02x' % (0, -1, 9999) '#00-1270f'
źródło
'#%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))
Wykorzystuje preferowaną metodę formatowania ciągów, zgodnie z opisem w PEP 3101 . Używa również
min()
imax
zapewnia to0 <= {r,g,b} <= 255
.Aktualizacja dodała funkcję zacisku zgodnie z sugestią poniżej.
Aktualizacja Z tytułu pytania i podanego kontekstu powinno być oczywiste, że oczekuje to 3 intów w [0,255] i zawsze zwróci kolor po przekazaniu 3 takich int. Jednak z komentarzy może to nie być oczywiste dla wszystkich, więc powiedzmy wprost:
źródło
To jest stare pytanie, ale dla informacji opracowałem pakiet z kilkoma narzędziami związanymi z kolorami i mapami kolorów oraz zawiera funkcję rgb2hex, którą chciałeś przekonwertować triplet na wartość heksa (którą można znaleźć w wielu innych pakietach, np. Matplotlib). Jest na pypi
i wtedy
>>> from colormap import rgb2hex >>> rgb2hex(0, 128, 64) '##008040'
Sprawdzana jest ważność wejść (wartości muszą zawierać się w przedziale od 0 do 255).
źródło
Stworzyłem dla niego pełny program w języku Python, w którym następujące funkcje mogą konwertować rgb na hex i odwrotnie.
def rgb2hex(r,g,b): return "#{:02x}{:02x}{:02x}".format(r,g,b) def hex2rgb(hexcode): return tuple(map(ord,hexcode[1:].decode('hex')))
Możesz zobaczyć pełny kod i samouczek pod następującym linkiem: Konwersja RGB na Hex i Hex na RGB za pomocą Pythona
źródło
triplet = (0, 128, 64) print '#'+''.join(map(chr, triplet)).encode('hex')
lub
from struct import pack print '#'+pack("BBB",*triplet).encode('hex')
python3 jest nieco inny
from base64 import b16encode print(b'#'+b16encode(bytes(triplet)))
źródło
Zauważ, że działa to tylko z pythonem 3.6 i nowszymi.
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)}"
Powyższe jest odpowiednikiem:
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
źródło
możesz użyć lambda i f-stringów (dostępne w Pythonie 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))
stosowanie
rgb2hex(r,g,b) #output = #hexcolor hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format
źródło
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue) background = RGB(0, 128, 64)
Wiem, że jednolinijkowe w Pythonie niekoniecznie są mile widziane. Ale są chwile, kiedy nie mogę się powstrzymać przed skorzystaniem z tego, na co pozwala parser Pythona. To ta sama odpowiedź, co rozwiązanie Dietricha Eppa (najlepsze), ale zawarte w jednej funkcji liniowej. Więc dziękuję Dietrich!
Używam go teraz z tkinter :-)
źródło
Oto bardziej kompletna funkcja do obsługi sytuacji, w których możesz mieć wartości RGB z zakresu [0,1] lub zakresu [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))
źródło
W Pythonie 3.6 możesz użyć f-stringów, aby uczynić to czystszym:
rgb = (0,128, 64) f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}'
Oczywiście możesz umieścić to w funkcji i jako bonus, wartości zostaną zaokrąglone i zamienione na int :
def rgb2hex(r,g,b): return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}' rgb2hex(*rgb)
źródło
Możesz także używać bitowych operatorów, co jest dość wydajne, chociaż wątpię, czy martwiłbyś się o wydajność w przypadku czegoś takiego. Jest też stosunkowo czysty. Zauważ, że nie zaciska ani nie sprawdza granic. Jest to obsługiwane co najmniej od wersji Python 2.7.17 .
hex(r << 16 | g << 8 | b)
Aby to zmienić, aby zaczynało się od #, możesz to zrobić:
"#" + hex(243 << 16 | 103 << 8 | 67)[2:]
źródło
Jestem naprawdę zaskoczony, że nikt nie zaproponował takiego podejścia:
W przypadku Pythona 2 i 3:
'#' + ''.join('{:02X}'.format(i) for i in colortuple)
Python 3.6+:
'#' + ''.join(f'{i:02X}' for i in colortuple)
Jako funkcja:
def hextriplet(colortuple): return '#' + ''.join(f'{i:02X}' for i in colortuple) color = (0, 128, 64) print(hextriplet(color))
źródło
Istnieje pakiet o nazwie webcolors. https://github.com/ubernostrum/webcolors
Ma metodę
webcolors.rgb_to_hex
>>> import webcolors >>> webcolors.rgb_to_hex((12,232,23)) '#0ce817'
źródło