Python将colorsys RGB坐标转换为十六进制

6

根据这篇答案,我正在使用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个回答

8
对于每种颜色,将 color * 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

很确定您想要乘以255而不是256 - Olivia Stork

4

1) 将浮点数乘以256并转换为整数。如果等于256,则减去1。

编辑:由于我收到了很多困惑的评论,之所以必须乘以256(如果最终结果为256则减1),是因为这样可以获得与每个整数输出相对应的完全相同数量的浮点值。

2) http://docs.python.org/2/library/string.html?highlight=hexadecimal#format-specification-mini-language

'x' 十六进制格式。使用小写字母表示大于9的数字的基数16。

使用它,将其大写并在前面加上#。


1
我认为你只是想将浮点数乘以255,而不是256,然后取其int()值。好好想一想。 - martineau
假设 int() 向下取整,那么如果你将其乘以 255,只有一个浮点数会变成 255,这意味着范围内的其余浮点数(0-254)将不成比例地更多。 - Patashu
如果您想要正确的四舍五入,请使用 int(round(f*255)) - martineau
1
这也不好 - 现在0和255的表示方式只有其他1-254条目的一半。想象一下,如果您想将0.0-1.0转换为0-2,并通过执行int(round(f*2))来实现 - 从0.0到0.25是0,从0.25到0.75是1,从0.75到1是2 - 1获得了大部分的结果!! - Patashu
虽然在计算上是正确的,但对于将0.0-1.0映射到0-255范围的应用来说,你所说的是无法感知的,并且通常不值得在现实世界中付出额外的努力。 - martineau
1
@martineau 或许是这样,但如果你不知道为什么建议是错误的,那么你会进行更少的粒度计算并产生错误的偏差。 - Patashu

0
将RGB的10进制基数-1转换为16进制基数,或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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接