在Python中将Hex转换为RGB值

Jul*_*ite 45 python rgb colors

在这里解决Jeremy的反应:将十六进制颜色转换为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()))
Run Code Online (Sandbox Code Playgroud)

使用该线print(hex_to_rgb('#B4FBB8'))我能够让它吐出正确的RGB值,即(180,251,184)

它可能非常简单 - 我对Python仍然很粗糙.

Joh*_*024 93

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

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

(以上是为Python 3编写的)

样品运行:

Enter hex: #B4FBB8
RGB = (180, 251, 184)
Run Code Online (Sandbox Code Playgroud)

写入文件

fhandle在保留格式的同时写入带句柄的文件:

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

  • 谢谢!辛苦了! (2认同)

Sup*_*ova 24

您可以ImageColor从枕头使用。

>>> from PIL import ImageColor
>>> ImageColor.getcolor("#23a9dd", "RGB")
(35, 169, 221)
Run Code Online (Sandbox Code Playgroud)


vwr*_*bel 11

一个懒惰的选项: 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)` (2认同)

alv*_*vas 10

尝试这个:

def rgb_to_hex(rgb):
    return '%02x%02x%02x' % rgb
Run Code Online (Sandbox Code Playgroud)

用法:

>>> rgb_to_hex((255, 255, 195))
'ffffc3'
Run Code Online (Sandbox Code Playgroud)

反之亦然:

def hex_to_rgb(hexa):
    return tuple(int(hexa[i:i+2], 16)  for i in (0, 2, 4))
Run Code Online (Sandbox Code Playgroud)

用法:

>>> hex_to_rgb('ffffc3')
(255, 255, 195)
Run Code Online (Sandbox Code Playgroud)


Pet*_*ano 8

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

from PIL import ImageColor

ImageColor.getrgb("#9b9b9b")
Run Code Online (Sandbox Code Playgroud)

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

[i/256 for i in ImageColor.getrgb("#9b9b9b")]
Run Code Online (Sandbox Code Playgroud)

  • 我认为最后的评论是错误的。255/256=0.99609。从 `ImageColor.getrbb` 返回的值为 [0 ... 255],硬性限制为 255 上限。除 256 你永远不会达到 1.0。除非我在这里错得很离谱,否则我建议你将其更改为 i/255。 (5认同)

lov*_*sus 8

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

非常简单:

>>> import matplotlib.colors
>>> matplotlib.colors.to_rgb('#B4FBB8')
(0.7058823529411765, 0.984313725490196, 0.7215686274509804)
Run Code Online (Sandbox Code Playgroud)

注意输入的to_rgb不需要是十六进制颜色格式,它允许几种颜色格式。

您还可以使用已弃用的 hex2color

>>> matplotlib.colors.hex2color('#B4FBB8')
(0.7058823529411765, 0.984313725490196, 0.7215686274509804)
Run Code Online (Sandbox Code Playgroud)

好处是我们有反函数,to_hex以及一些额外的函数,例如,rgb_to_hsv


rob*_*rto 5

此函数将从十六进制代码以浮点数形式返回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 '#'
Run Code Online (Sandbox Code Playgroud)

此函数将从RGB值返回十六进制代码。

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


Saa*_*aad 5

因为十六进制代码可以像"#FFF""#000""#0F0"甚至"#ABC"只使用三位数字。这些只是编写代码的简写版本,即三对相同的数字"#FFFFFF""#000000""#00FF00""#AABBCC"


该函数的制作方式使其既可以使用简写,也可以使用全长的十六进制代码。如果参数hsl = Falseelse 返回 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.
    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.')
Run Code Online (Sandbox Code Playgroud)

以下是一些 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.
Run Code Online (Sandbox Code Playgroud)


Gab*_*elC 5

以下函数将十六进制字符串转换为 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)
Run Code Online (Sandbox Code Playgroud)

这会将 hexadecimal_string 转换为十进制数

int(hex_string, 16)
Run Code Online (Sandbox Code Playgroud)

例如:

int('ff', 16) # Gives 255 in integer data type
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

42031 次

最近记录:

6 年,1 月 前