python - pyplot - ¿Cómo convierto un triplete hexadecimal a una tupla RGB y viceversa?
rgba colors python (11)
Me gustaría convertir un triplete hexagonal en una tupla RGB y luego convertir una tupla en un triplete hexadecimal.
con matplotlib
matplotlib usa tuplas RGB con valores entre 0 y 1:
from matplotlib.colors import hex2color, rgb2hex
hex_color = ''#00ff00''
rgb_color = hex2color(hex_color)
hex_color_again = rgb2hex(rgb_color)
tanto rgb_color
como hex_color
están en un formato aceptable por matplotlib.
con webcolors
html utiliza tuplas RGB con valores entre 0 y 255.
puede convertir entre ellos con el módulo webcolors, usando las funciones hex_to_rgb
, rgb_to_hex
Aqui tienes. Lo uso para convertir color a formato de color #RGBA
en formato #RGBA
con prefix=#
.
def rgba_hex( color, prefix = ''0x'' ):
if len( color ) == 3:
color = color + (255,)
hexColor = prefix + ''''.join( [ ''%02x'' % x for x in color ] )
return hexColor
USO:
In [3]: rgba_hex( (222, 100, 34) )
Out[3]: ''0xde6422ff''
In [4]: rgba_hex( (0,255,255) )
Out[4]: ''0x00ffffff''
In [5]: rgba_hex( (0,255,255,0) )
Out[5]: ''0x00ffff00''
Consulte https://.com/a/214657/3787376 para conocer las funciones realmente simples para realizar estos trabajos de conversión sin necesidad de módulos de terceros o código largo / elegante. Los he comprobado y funcionan.
Aquí está el código a continuación si no quieres seguir el enlace. Gracias al usuario Jeremy Cantrell por ello:
>>> bytes((97, 85, 154)).hex()
''61559a''
Encontré una manera simple:
red, green, blue = bytes.fromhex("aabbcc")
HEX a tuple RGB
def hex_to_rgb(value):
value = value.lstrip(''#'')
lv = len(value)
return tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))
def rgb_to_hex(rgb):
return ''#%02x%02x%02x'' % rgb
hex_to_rgb("#ffffff") #==> (255, 255, 255)
hex_to_rgb("#ffffffffffff") #==> (65535, 65535, 65535)
rgb_to_hex((255, 255, 255)) #==> ''#ffffff''
rgb_to_hex((65535, 65535, 65535)) #==> ''#ffffffffffff''
Tuple RGB a HEX
>>> tuple(bytes.fromhex(''61559a''))
(97, 85, 154)
No se necesitan importaciones!
¿Qué es esta magia?
Dado que los objetos de bytes son secuencias de enteros (similar a una tupla), para un objeto de bytes b, b [0] será un entero, mientras que b [0: 1] será un objeto de bytes de longitud 1
...
La representación de los objetos de bytes utiliza el formato literal (b ''...''), ya que a menudo es más útil que, por ejemplo, los bytes ([46, 46, 46]). Siempre puede convertir un objeto de bytes en una lista de enteros utilizando la lista (b).
Fuente: https://docs.python.org/3/library/stdtypes.html#bytes-objects
Puede usar una tabla de consulta con algunos cortes y desplazamientos, todas operaciones relativamente rápidas, para crear un par de funciones que funcionarán sin cambios tanto en Python 2 como en 3:
_NUMERALS = ''0123456789abcdefABCDEF''
_HEXDEC = {v: int(v, 16) for v in (x+y for x in _NUMERALS for y in _NUMERALS)}
LOWERCASE, UPPERCASE = ''x'', ''X''
def rgb(triplet):
return _HEXDEC[triplet[0:2]], _HEXDEC[triplet[2:4]], _HEXDEC[triplet[4:6]]
def triplet(rgb, lettercase=LOWERCASE):
return format(rgb[0]<<16 | rgb[1]<<8 | rgb[2], ''06''+lettercase)
if __name__ == ''__main__'':
print(''{}, {}''.format(rgb(''aabbcc''), rgb(''AABBCC'')))
# -> (170, 187, 204), (170, 187, 204)
print(''{}, {}''.format(triplet((170, 187, 204)),
triplet((170, 187, 204), UPPERCASE)))
# -> aabbcc, AABBCC
print(''{}, {}''.format(rgb(''aa0200''), rgb(''AA0200'')))
# -> (170, 2, 0), (170, 2, 0)
print(''{}, {}''.format(triplet((170, 2, 0)),
triplet((170, 2, 0), UPPERCASE)))
# -> aa0200, AA0200
Tratando de ser pitónico :
>>> rgbstr=''aabbcc''
>>> tuple(ord(c) for c in rgbstr.decode(''hex''))
(170, 187, 204)
>>> tuple(map(ord, rgbstr.decode(''hex''))
(170, 187, 204)
y
>>> rgb=(12,50,100)
>>> "".join(map(chr, rgb)).encode(''hex'')
''0c3264''
Un enfoque muy simplista para convertir rgb a hexadecimal
>>> rgb = (255, 255, 255)
>>> r, g , b = rgb
>>> hex(r)
''0xff''
>>> hex(r) + hex(g)[2:] + hex(b)[2:]
''0xffffff''
>>>
Un enfoque simplista para convertir Hex en rgb
>>> h = ''0xffffff''
>>> h1, h2, h3 = h[0:4], ''0x'' + h[4:6], ''0x'' + h[6:8]
>>> h1, h2, h3
(''0xff'', ''0xff'', ''0xff'')
>>> r, g , b = int(h1, 16), int(h2, 16), int(h3, 16)
>>> r, g, b
(255, 255, 255)
Utilice un módulo que proporciona algunas de estas instalaciones: webcolors
>>> hex_to_rgb(''#000080'')
(0, 0, 128)
>>> rgb_to_hex((255, 255, 255))
''#ffffff''
Función doc:
hex_to_rgb (hex_value) Convierta un valor de color hexadecimal a un grupo de 3 enteros adecuado para usar en un triplete rgb () que especifique ese color.
rgb_to_hex (rgb_triplet): Convierte una tupla de 3 enteros, adecuada para usar en un triplete de color rgb (), en un valor hexadecimal normalizado para ese color.
>>> import struct
>>> rgbstr=''aabbcc''
>>> struct.unpack(''BBB'',rgbstr.decode(''hex''))
(170, 187, 204)
y
>>> rgb = (50,100,150)
>>> struct.pack(''BBB'',*rgb).encode(''hex'')
''326496''
def hex_to_int_color(v):
if v[0] == ''#'':
v = v[1:]
assert(len(v) == 6)
return int(v[:2], 16), int(v[2:4], 16), int(v[4:6], 16)
def int_to_hex_color(v):
assert(len(v) == 3)
return ''#%02x%02x%02x'' % v
import re
def hex_to_int_color(v):
return tuple(int(i,16) for i in re.match(
r''^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$'', v,
flags=re.IGNORECASE).groups())
def int_to_hex_color(v):
return ''#%02x%02x%02x'' % v