在Python中将Hex转换为RGB值

时间:2015-04-15 06:48:00

标签: python colors rgb

在这里解决Jeremy的回应:Converting hex color to RGB and vice-versa我能够获得一个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仍然很粗糙。

10 个答案:

答案 0 :(得分:68)

我相信这可以满足您的需求:

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

答案 1 :(得分:9)

一个懒惰的选择: webcolors包具有hex_to_rgb功能。

答案 2 :(得分:8)

您可以在Pillow中使用<div id="backinblack"> <h1 data-text="test">test</h1> </div>

ImageColor

答案 3 :(得分:4)

PIL在ImageColor中也具有此功能。

from PIL import ImageColor

ImageColor.getrgb("#9b9b9b")

如果您希望数字从0到1

[i/256 for i in ImageColor.getrgb("#9b9b9b")]

答案 4 :(得分:3)

HEX 代码可以像 "#FFF""#000""#0F0"甚至"#ABC"一样,仅使用三位数字。< / em>这些只是编写代码的简写形式,它们是三对相同的数字"#FFFFFF""#000000""#00FF00""#AABBCC"


此功能的制作方式使其既可以使用速记功能,也可以使用完整长度的HEX代码。如果参数 hsl = False 否则返回HSL值,则返回RGB值。

import re

def hex_to_rgb(hx, hsl=False):
    """Converts a HEX code into RGB or HSL.
    Args:
        hx (str): Takes both short as well as long HEX codes.
        hsl (bool): Converts the given HEX code into HSL value if True.
    Return:
        Tuple of length 3 consisting of either int or float values."""
    if re.compile(r'#[a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?$').match(hx):
        div = 255.0 if hsl else 0
        if len(hx) <= 4:
            return tuple(int(hx[i]*2, 16) / div if div else
                         int(hx[i]*2, 16) for i in (1, 2, 3))
        else:
            return tuple(int(hx[i:i+2], 16) / div if div else
                         int(hx[i:i+2], 16) for i in (1, 3, 5))
    else:
        raise ValueError(f'"{hx}" is not a valid HEX code.')

这是一些IDLE输出。

>>> hex_to_rgb('#FFB6C1')
>>> (255, 182, 193)

>>> hex_to_rgb('#ABC')
>>> (170, 187, 204)

>>> hex_to_rgb('#FFB6C1', hsl=True)
>>> (1.0, 0.7137254901960784, 0.7568627450980392)

>>> hex_to_rgb('#ABC', hsl=True)
>>> (0.6666666666666666, 0.7333333333333333, 0.8)

>>> hex_to_rgb('#00FFFF')
>>> (0, 255, 255)

>>> hex_to_rgb('#0FF')
>>> (0, 255, 255)

答案 5 :(得分:3)

另一个选择:matplotlib.colors模块。

非常简单:

>>> import matplotlib.colors
>>> matplotlib.colors.to_rgb('#B4FBB8')
(0.7058823529411765, 0.984313725490196, 0.7215686274509804)

请注意,to_rgb的输入不必为十六进制颜色格式,它可以接受几种颜色格式。

您还可以使用已弃用的hex2color

>>> matplotlib.colors.hex2color('#B4FBB8')
(0.7058823529411765, 0.984313725490196, 0.7215686274509804)

好处是,我们具有反函数to_hex和很少的额外函数,例如rgb_to_hsv

答案 6 :(得分:2)

这里有两个小错误!

hex == input("")

应该是:

user_hex = input("")

您想将input()的输出分配给hex,而不是检查比较。此外,正如评论中所述(@koukouviou),请勿覆盖hex,而是将其称为user_hex

此外:

print(hex_to_rgb(hex()))

应该是:

print(hex_to_rgb(user_hex))

您想要使用十六进制的值,而不是类型的可调用方法(__call__)。

答案 7 :(得分:0)

浮动版本:

 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}'

答案 8 :(得分:0)

我看到的所有答案都涉及对十六进制字符串的操纵。在我看来,我更喜欢使用编码的整数和RGB三元组本身,而不仅仅是字符串。这样的好处是不需要用十六进制表示颜色-颜色可以是八进制,二进制,十进制等等。

将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'

对于相反的方向,我们需要更多的数学运算。我已将以下内容从我的回答中移至类似的Math exchange question

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')

通过这种方法,您可以轻松地在字符串之间进行转换。

答案 9 :(得分:0)

以下函数会将十六进制字符串转换为rgb值:

def hex_to_rgb(hex_string):
    r_hex = hex_string[1:3]
    g_hex = hex_string[3:5]
    b_hex = hex_string[5:7]
    return int(r_hex, 16), int(g_hex, 16), int(b_hex, 16)

这会将十六进制字符串转换为十进制数字

int(hex_string, 16)

例如:

int('ff', 16) # Gives 255 in integer data type