Подтвердить что ты не робот

Как преобразовать шестнадцатеричный триплет в кортеж RGB и обратно?

Я хотел бы преобразовать шестнадцатеричный триплет в кортеж RGB, а затем преобразовать кортеж в шестнадцатеричный триплет.

4b9b3361

Ответ 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'