Python 将 colorsys RGB 坐标转换为十六进制
根据这个回答,我在Python中生成了一些均匀分布的颜色,代码如下:
>>> import colorsys
>>> num_colors = 22
>>> hsv_tuples = [(x*1.0/num_colors, 0.5, 0.5) for x in range(num_colors)]
>>> rgb_tuples = map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples)
>>> rgb_tuples
[(0.5, 0.25, 0.25), (0.5, 0.3181818181818182, 0.25), (0.5, 0.38636363636363635, 0.25), (0.5, 0.45454545454545453, 0.25), (0.4772727272727273, 0.5, 0.25), (0.4090909090909091, 0.5, 0.25), (0.34090909090909094, 0.5, 0.25), (0.2727272727272727, 0.5, 0.25), (0.25, 0.5, 0.2954545454545454), (0.25, 0.5, 0.36363636363636365), (0.25, 0.5, 0.43181818181818177), (0.25, 0.5, 0.5), (0.25, 0.4318181818181819, 0.5), (0.25, 0.36363636363636354, 0.5), (0.25, 0.2954545454545454, 0.5), (0.2727272727272727, 0.25, 0.5), (0.34090909090909083, 0.25, 0.5), (0.40909090909090917, 0.25, 0.5), (0.4772727272727273, 0.25, 0.5), (0.5, 0.25, 0.4545454545454546), (0.5, 0.25, 0.38636363636363646), (0.5, 0.25, 0.3181818181818181)]
那么,怎么把这些RGB元组转换回RGB十六进制字符串,比如#FF00AA
呢?这可能是个简单的问题,但我一直找不到答案。
3 个回答
0
最有效的方法是把以十进制表示的RGB颜色转换成十六进制,也就是HEX格式。
r = int(input('R: '))
g = int(input('G: '))
b = int(input('B: '))
def rgbToHex(r,g,b):
rgb = [r,g,b]
x = ''
for i in rgb:
x += format(i,'02x').upper()
if x[0] == x[1] and x[2] == x[3] and x[4] == x[5]:
x = x[0] + x[2] + x[4]
return '#'+x
print(rgbToHex(r,g,b))
4
1) 把小数乘以256,然后转成整数。如果结果是256,就减去1。
补充说明:因为有很多人不太明白,所以我解释一下,为什么要乘以256(如果结果是256就减1)。这样做是为了确保每个整数输出都有对应的相同数量的小数值。
'x' 是十六进制格式。它会把数字以16进制的方式输出,数字9以上的部分用小写字母表示。
用这个格式,然后把字母变成大写,再在前面加一个#符号。
8
对于每种颜色,先把颜色值乘以256,然后取整,最后以十六进制的形式输出(确保是两位数)。例如:
In [1]: rgb_tuples = [(0.5, 0.25, 0.25), (0.5, 0.3181818181818182, 0.25), (0.5, 0.38636363636363635, 0.25), (0.5, 0.45454545454545453, 0.25), (0.4772727272727273, 0.5, 0.25), (0.4090909090909091, 0.5, 0.25), (0.34090909090909094, 0.5, 0.25), (0.2727272727272727, 0.5, 0.25), (0.25, 0.5, 0.2954545454545454), (0.25, 0.5, 0.36363636363636365), (0.25, 0.5, 0.43181818181818177), (0.25, 0.5, 0.5), (0.25, 0.4318181818181819, 0.5), (0.25, 0.36363636363636354, 0.5), (0.25, 0.2954545454545454, 0.5), (0.2727272727272727, 0.25, 0.5), (0.34090909090909083, 0.25, 0.5), (0.40909090909090917, 0.25, 0.5), (0.4772727272727273, 0.25, 0.5), (0.5, 0.25, 0.4545454545454546), (0.5, 0.25, 0.38636363636363646), (0.5, 0.25, 0.3181818181818181)]
In [2]: for (r,g,b) in rgb_tuples:
...: print '%02x%02x%02x' % (int(r*255), int(g*255), int(b*255))
...:
804040
805140
806240
807440