Я хотел бы преобразовать шестнадцатеричный триплет в кортеж RGB, а затем преобразовать кортеж в шестнадцатеричный триплет.
Как преобразовать шестнадцатеричный триплет в кортеж RGB и обратно?
Ответ 1
Вы можете использовать справочную таблицу с некоторыми нарезками и сдвигами -— все относительно быстрые операции — для создания нескольких функций, которые будут работать без изменений как в Python 2, так и в 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
Ответ 2
>>> import struct
>>> rgbstr='aabbcc'
>>> struct.unpack('BBB',rgbstr.decode('hex'))
(170, 187, 204)
и
>>> rgb = (50,100,150)
>>> struct.pack('BBB',*rgb).encode('hex')
'326496'
Ответ 3
Попытка быть питонической:
>>> rgbstr='aabbcc'
>>> tuple(ord(c) for c in rgbstr.decode('hex'))
(170, 187, 204)
>>> tuple(map(ord, rgbstr.decode('hex'))
(170, 187, 204)
и
>>> rgb=(12,50,100)
>>> "".join(map(chr, rgb)).encode('hex')
'0c3264'
Ответ 4
Очень упрощенный подход к преобразованию rgb в hex
>>> rgb = (255, 255, 255)
>>> r, g , b = rgb
>>> hex(r)
'0xff'
>>> hex(r) + hex(g)[2:] + hex(b)[2:]
'0xffffff'
>>>
Простейший подход для преобразования Hex в 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)
Используйте модуль, который предоставляет некоторые из этих возможностей: webcolors
>>> hex_to_rgb('#000080')
(0, 0, 128)
>>> rgb_to_hex((255, 255, 255))
'#ffffff'
Функция doc:
hex_to_rgb (hex_value) Преобразуйте шестнадцатеричное значение цвета в 3 набора целых чисел, подходящих для использования в триплете rgb(), указав этот цвет.
rgb_to_hex (rgb_triplet): Преобразуйте трехмерный набор целых чисел, подходящий для использования в цветовой трипке rgb(), до нормализованного шестнадцатеричного значения для этого цвета.
Ответ 5
Я нашел простой способ:
red, green, blue = bytes.fromhex("aabbcc")
Ответ 6
с matplotlib
matplotlib использует кортежи RGB со значениями от 0 до 1:
from matplotlib.colors import hex2color, rgb2hex
hex_color = '#00ff00'
rgb_color = hex2color(hex_color)
hex_color_again = rgb2hex(rgb_color)
оба rgb_color
и hex_color
находятся в формате, приемлемом для matplotlib.
с webcolors
html использует кортежи RGB со значениями от 0 до 255.
вы можете конвертировать между ними с помощью webcolors модуля, используя функции hex_to_rgb
, rgb_to_hex
Ответ 7
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
Ответ 8
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
Ответ 9
См. fooobar.com/questions/125535/... для действительно простых функций для этих преобразований, не требуя каких-либо сторонних модулей или длинного/фантазийного кода. Я проверил их, и они работают. Ниже приведен код ниже, если вы не хотите следовать ссылке. Благодаря пользователю Джереми Кантрелл:
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'
Ответ 10
Здесь вы идете. Я использую его для преобразования цвета в формат цвета graphviz в формате #RGBA
с помощью 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
ПРИМЕНЕНИЕ:
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'