在 Python 中将十六进制转换为 RGB 值

Posted

技术标签:

【中文标题】在 Python 中将十六进制转换为 RGB 值【英文标题】:Converting Hex to RGB value in Python 【发布时间】:2022-01-22 08:51:15 【问题描述】:

在这里处理 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 还是很陌生。

【问题讨论】:

可能重复:***.com/questions/5661725/… 【参考方案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)) ))

【讨论】:

美丽。将 23 行减少到两行,唯一的建议是修复到 for i in (0, 2, 4))) 问题,John1024,我正在使用 f.write 将结果(例如 #FFFFFF 为 (255, 255, 255))写入文件,它要求它是字符串而不是元组。有什么办法可以将它转换为保留逗号和空格的字符串?干杯:) @JulianWhite 没问题。我使用适合f.write 的字符串格式更新了答案。 出现错误“TypeError:'float'对象不能被解释为整数” @John1024 明白了。当我开始使用2.7.12 时,我使用的是未来的print,我忘记了其他人的所有问题。【参考方案2】:

您可以使用 Pillow 中的ImageColor

>>> from PIL import ImageColor
>>> ImageColor.getcolor("#23a9dd", "RGB")
(35, 169, 221)

【讨论】:

嘿@SuperNova 如何获取颜色名称而不是像素值? 高速公路@Mvk1312。请检查这个。 ***.com/questions/9694165/…【参考方案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

【讨论】:

【参考方案4】:

一个懒惰的选择: webcolors 包有一个 hex_to_rgb 函数。

【讨论】:

顺便说一下,目前 webcolors 没有 hex_to_rgb 元组在 0 和 1 范围内以十进制值指定(比如 hex_to_rgb_decimal)。但是,您可以使用导入 numpy 和 webcolors 的代码:tuple(numpy.array(webcolors.hex_to_rgb('#9C0006'))/255.0) 这显然是唯一对我有用的解决方案。【参考方案5】:

PIL 也有这个功能,在 ImageColor 中。

from PIL import ImageColor

ImageColor.getrgb("#9b9b9b")

如果你想要从 0 到 1 的数字

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

【讨论】:

如果您需要 0…1 的值:rgb = [i/256 for i in (ImageColor.getrgb("#9b9b9b"))] 我认为最后的评论是错误的。 255/256=0.99609。从ImageColor.getrbb 返回的值是 [0 ... 255],由 255 上限硬限制。通过除以 256,您将永远不会达到 1.0。除非我在这里非常错误,否则我建议您将其更改为 i/255。【参考方案6】:

此函数将从 Hex 代码中以浮点形式返回 RGB 值。

def hextofloats(h):
    '''Takes a hex rgb string (e.g. #ffffff) and returns an RGB tuple (float, float, float).'''
    return tuple(int(h[i:i + 2], 16) / 255. for i in (1, 3, 5)) # skip '#'

此函数将从 RGB 值返回 Hex 代码。

def floatstohex(rgb):
    '''Takes an RGB tuple or list and returns a hex RGB string.'''
    return f'#int(rgb[0]*255):02xint(rgb[1]*255):02xint(rgb[2]*255):02x'

【讨论】:

【参考方案7】:

以下函数会将十六进制字符串转换为 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

【讨论】:

我发现这个解决方案是最快的。【参考方案8】:

HEX 代码可以是 "#FFF""#000""#0F0" 甚至 "#ABC",只使用三位数字。编写代码的版本,它们是三对相同的数字"#FFFFFF""#000000""#00FF00""#AABBCC"


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

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.
    Raise:
        ValueError: If given value is not a valid HEX code."""
    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))
        return tuple(int(hx[i:i+2], 16) / div if div else
                     int(hx[i:i+2], 16) for i in (1, 3, 5))
    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)

>>> hex_to_rgb('#0FFG')  # When invalid hex is given.
ValueError: "#0FFG" is not a valid HEX code.

【讨论】:

【参考方案9】:

这里有两个小错误!

hex == input("")

应该是:

user_hex = input("")

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

还有:

print(hex_to_rgb(hex()))

应该是:

print(hex_to_rgb(user_hex))

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

【讨论】:

最好避免覆盖hex。也许像hex_in 或类似的东西更好 好点,@koukouviou - Python 将其报告为内置名称。【参考方案10】:

我看到的所有答案都涉及对十六进制字符串的操作。在我看来,我更喜欢使用编码整数和 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')

通过这种方法,您可以轻松地与字符串相互转换。

【讨论】:

那么问题是关于十六进制的。 它没有回答这个问题,但它可以深入了解它是如何在概念上完成的,所以 +1。 (教人钓鱼等等……)

以上是关于在 Python 中将十六进制转换为 RGB 值的主要内容,如果未能解决你的问题,请参考以下文章

在Javascript中将rgb字符串转换为十六进制

如何在 C++ 中将 RGB 颜色值转换为十六进制值?

如何在 Python 中将 RGB 图像转换为灰度图像?

在 Python 中将单个整数像素数组转换为 RGB 三元组

在 Python 中将 3 个单独的 numpy 数组组合为 RGB 图像

如何在 Python 中将十六进制转换为十进制? [复制]