Преобразование значения Hex в RGB в Python

Отключение ответа Джереми здесь: Преобразование шестнадцатеричного цвета в RGB и наоборот Я смог получить программу python для преобразования предварительно настроенных шестнадцатеричных кодов цвета (пример # B4FBB8), однако с точки зрения конечного пользователя мы не можем просить людей редактировать код и запускать оттуда. Как можно заставить пользователя ввести шестнадцатеричное значение, а затем вывести из него значение 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'

print('Please enter your colour hex')

hex == input("")

print('Calculating...')
print(hex_to_rgb(hex()))

Используя строку print(hex_to_rgb('#B4FBB8')), я могу заставить ее выплюнуть правильное значение RGB, которое (180, 251, 184)

Это, наверное, очень просто - я все еще довольно груб с Python.

Ответ 1

Я считаю, что это делает то, что вы ищете:

h = input('Enter hex: ').lstrip('#')
print('RGB =', tuple(int(h[i:i+2], 16) for i in (0, 2, 4)))

(Выше написано для Python 3)

Образец прогона:

Enter hex: #B4FBB8
RGB = (180, 251, 184)

Запись в файл

Чтобы записать в файл с дескриптором fhandle при сохранении форматирования:

fhandle.write('RGB = {}'.format( tuple(int(h[i:i+2], 16) for i in (0, 2, 4)) ))

Ответ 2

ленивый вариант: webcolors пакет имеет функцию hex_to_rgb.

Ответ 3

Здесь есть две небольшие ошибки!

hex == input("")

Должно быть:

user_hex = input("")

Вы хотите назначить вывод input() на hex, а не для сравнения. Кроме того, как упоминалось в комментариях (@koukouviou), не переопределяйте hex, а называйте это чем-то вроде user_hex.

также:

print(hex_to_rgb(hex()))

Должно быть:

print(hex_to_rgb(user_hex))

Вы хотите использовать значение hex, а не тип вызываемого метода (__call__).

Ответ 4

версия с плавающей точкой:

 def hextofloats(h):
    return [int(h[i:i + 2], 16) / 255. for i in (1, 3, 5)] # skip '#'

 def floatstohex(rgb):
    return f'#{int(rgb[0]*255):02x}{int(rgb[1]*255):02x}{int(rgb[2]*255):02x}'

Ответ 5

Все ответы, которые я видел, включают манипулирование шестнадцатеричной строкой. На мой взгляд, я бы предпочел работать с закодированными целыми числами и самими тройками RGB, а не только со строками. Преимущество этого состоит в том, что не требуется, чтобы цвет был представлен в hexadecimal--, он может быть в восьмеричном, двоичном, десятичном виде, что у вас есть.

Конвертировать RGB-тройку в целое число легко.

rgb = (0xc4, 0xfb, 0xa1) # (196, 251, 161)

def rgb2int(r,g,b):
    return (256**2)*r + 256*g + b

c = rgb2int(*rgb) # 12909473
print(hex(c))     # '0xc4fba1'

Нам нужно немного больше математики для противоположного направления. Я поднял следующую фразу из своего ответа на похожий вопрос по обмену математиками.

c = 0xc4fba1

def int2rgb(n):
    b = n % 256
    g = int( ((n-b)/256) % 256 )      # always an integer
    r = int( ((n-b)/256**2) - g/256 ) # ditto
    return (r,g,b)

print(tuple(map(hex, int2rgb(c)))) # ('0xc4', '0xfb', '0xa1')

При таком подходе вы можете легко преобразовывать строки в строки и обратно.