Преобразование цветового кортежа RGB в шестизначный код в Python - PullRequest
60 голосов
/ 01 августа 2010

Мне нужно преобразовать (0, 128, 64) во что-то подобное # 008040 Я не уверен, как назвать последнее, что затрудняет поиск.

Ответы [ 10 ]

135 голосов
/ 01 августа 2010

Используйте оператор форматирования %:

>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'

Обратите внимание, что он не будет проверять границы ...

>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'
42 голосов
/ 01 августа 2010
def clamp(x): 
  return max(0, min(x, 255))

"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))

При этом используется предпочтительный метод форматирования строки, как , описанный в PEP 3101 .Он также использует min() и max, чтобы 0 <= {r,g,b} <= 255.

Обновление добавило функцию зажима, как предложено ниже.

Обновление Из заголовка вопроса и данного контекста должно быть очевидно, что в [0,255] ожидается 3 дюйма и всегда будет возвращаться цвет при пропуске 3 таких целых.Однако, из комментариев, это может быть неочевидно для всех, поэтому позвольте прямо заявить:

При условии трех int значений будет возвращен действительный шестнадцатеричный триплет, представляющий цвет,Если эти значения находятся между [0,255], то они будут обрабатываться как значения RGB и возвращать цвет, соответствующий этим значениям.

15 голосов
/ 22 октября 2015

Это старый вопрос, но для информации я разработал пакет с некоторыми утилитами, связанными с цветами и цветовыми картами, и содержит функцию rgb2hex, которую вы искали для преобразования триплета в значение hexa (которое можно найти во многих других пакетах, например, matplotlib).).Он находится на pypi

pip install colormap

, а затем

>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'

Проверяется допустимость входов (значения должны быть в диапазоне от 0 до 255).

7 голосов
/ 23 апреля 2017

Я создал полную программу на Python, для которой следующие функции могут конвертировать rgb в hex и наоборот.

def rgb2hex(r,g,b):
    return "#{:02x}{:02x}{:02x}".format(r,g,b)

def hex2rgb(hexcode):
    return tuple(map(ord,hexcode[1:].decode('hex')))

Полный код и руководство можно посмотреть по следующей ссылке: RGBв шестнадцатеричное и шестнадцатеричное преобразование в RGB с использованием Python

7 голосов
/ 01 августа 2010
triplet = (0, 128, 64)
print '#'+''.join(map(chr, triplet)).encode('hex')

или

from struct import pack
print '#'+pack("BBB",*triplet).encode('hex')

Python3 немного отличается

from base64 import b16encode
print(b'#'+b16encode(bytes(triplet)))
2 голосов
/ 19 сентября 2018

вы можете использовать лямбда и f-строки (доступно в python 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))

использование

rgb2hex(r,g,b) #output = #hexcolor hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format

2 голосов
/ 04 января 2018
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)

background = RGB(0, 128, 64)

Я знаю, что в Python на однострочники не обязательно обращают внимание. Но бывают случаи, когда я не могу удержаться, воспользовавшись тем, что позволяет парсер Python. Это тот же ответ, что и у решения Дитриха Эппа (лучший), но заключенный в одну строчку. Итак, спасибо, Дитрих!

Я использую его сейчас с tkinter: -)

0 голосов
/ 13 марта 2018

Обратите внимание, что это работает только с python3.6 и выше.

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)}"

Выше эквивалентно:

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
0 голосов
/ 16 января 2018

Вот более полная функция для обработки ситуаций, в которых могут быть значения RGB в диапазоне [0,1] или диапазоне [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))
0 голосов
/ 26 ноября 2017

В Python 3.6 , вы можете использовать f-strings , чтобы сделать это чище: function , а в качестве бонуса значения округляются и преобразуются в int :

def rgb2hex(r,g,b):
    return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}'

rgb2hex(*rgb)
...