在这里解决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仍然很粗糙。
答案 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