xkcd pyplot colores color python colors

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