在Python中将RGB颜色元组转换为六位代码


87

我需要将(0、128、64)转换为此类#008040。我不确定该怎么称呼后者,这使搜索变得困难。


请参阅先前的SO答案stackoverflow.com/questions/214359/…-在这三个答案中,得票最多的一个包含一个独立的python代码段,以完成我认为您要追求的目标。

3
您要查找的术语是Hex Triplet。en.wikipedia.org/wiki/Hex_color#Hex_triplet
Mark Ransom

对于更笼统的问题,比这里提供的答案要好得多:stackoverflow.com/a/57197866/624066
MestreLion

Answers:


183

使用格式运算符%

>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'

请注意,它不会检查范围...

>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'

2位数的限制是否确实必要?只要RGB值在0-255的适当范围内,就不需要它。所以你可以做'#%x%x%x' % (r, g, b)
顺便说一句

3
实际上,现在我看到,如果您的值为0,则需要用另一个0填充。因此使用02使其成为两位数。
wordsforthewise

51
def clamp(x): 
  return max(0, min(x, 255))

"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))

如PEP 3101中所述,这使用了字符串格式化的首选方法。它还使用min()max来确保0 <= {r,g,b} <= 255

Update如下所示添加了钳位功能。

更新从问题的标题和给定的上下文来看,很明显,这需要[0,255]中的3个整数,并且在传递3个这样的整数时将始终返回颜色。但是,从评论中看,这可能并非对所有人都显而易见,因此请明确指出:

提供三个int值,它将返回代表颜色的有效十六进制三元组。如果这些值在[0,255]之间,则它将这些值视为RGB值,并返回与这些值相对应的颜色。


20

这是一个老问题,但是为了提供信息,我开发了一个程序包,其中包含一些与颜色和颜色图有关的实用程序,并且包含了您想要将三元组转换为六进制值的rgb2hex函数(可以在许多其他程序包中找到,例如matplotlib)。在pypi上

pip install colormap

然后

>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'

检查输入的有效性(值必须在0到255之间)。


3
我尝试使用rgb2hex,但出现错误“ ImportError:没有名为easydev.tools的模块”。您能提出解决方案吗?
阿比希尔斯

尝试重新安装easydev。然后“ pip3 install easydev”。
Shounak Ray

16

我为它创建了一个完整的python程序,以下函数可以将rgb转换为hex,反之亦然。

def rgb2hex(r,g,b):
    return "#{:02x}{:02x}{:02x}".format(r,g,b)

def hex2rgb(hexcode):
    return tuple(map(ord,hexcode[1:].decode('hex')))

您可以在以下链接中查看完整的代码和教程:使用Python将RGB转换为Hex和将Hex转换为RGB


它不适用于rgb的十进制值。您能建议我任何解决方案吗?
阿比希尔斯

回合。最终颜色应该没有太大差异。
Shounak Ray

9
triplet = (0, 128, 64)
print '#'+''.join(map(chr, triplet)).encode('hex')

要么

from struct import pack
print '#'+pack("BBB",*triplet).encode('hex')

python3略有不同

from base64 import b16encode
print(b'#'+b16encode(bytes(triplet)))

3

请注意,这仅适用于python3.6及更高版本。

def rgb2hex(color):
    """Converts a list or tuple of color to an RGB string

    Args:
        color (list|tuple): the list or tuple of integers (e.g. (127, 127, 127))

    Returns:
        str:  the rgb string
    """
    return f"#{''.join(f'{hex(c)[2:].upper():0>2}' for c in color)}"

以上等同于:

def rgb2hex(color):
    string = '#'
    for value in color:
       hex_string = hex(value)  #  e.g. 0x7f
       reduced_hex_string = hex_string[2:]  # e.g. 7f
       capitalized_hex_string = reduced_hex_string.upper()  # e.g. 7F
       string += capitalized_hex_string  # e.g. #7F7F7F
    return string

应用于(13,13,12)的函数rgb2hex给出0xDDC,但是RGB至HEX的网站将其表示为0x0D0D0C,这也与数字应为13 * 65536 + 13 * 256 + 12的想法一致,和0xDDC被Python读取为3548。–
Lars Ericson

CSS颜色不一致。有6位十六进制颜色,3位十六进制颜色,带有小数和百分比的rgb表示法,hsl等。我调整了公式以始终提供6位十六进制颜色,尽管我认为它可能更一致,但我不确定它是否更正确。
Brian Bruggeman

3

您可以使用lambda和f字符串(在python 3.6+中可用)

rgb2hex = lambda r,g,b: f"#{r:02x}{g:02x}{b:02x}"
hex2rgb = lambda hx: (int(hx[0:2],16),int(hx[2:4],16),int(hx[4:6],16))

用法

rgb2hex(r,g,b) #output = #hexcolor hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format


1
出于多种原因,建议不要直接调用lambda。我在经过审查的项目中使用了这种方法,每个人都说相同的话,而不是直接打电话。
MikeyB

2
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)

background = RGB(0, 128, 64)

我知道Python中的单行代码不一定会被善待。但是有时候我无法抗拒利用Python解析器允许的功能。答案与Dietrich Epp的解决方案(最佳)相同,但都包含在单行功能中。所以,谢谢迪特里希!

我现在在tkinter中使用它:-)


2

这是一个更完整的功能,用于处理您的RGB值可能在[0,1][0,255]范围内的情况。

def RGBtoHex(vals, rgbtype=1):
  """Converts RGB values in a variety of formats to Hex values.

     @param  vals     An RGB/RGBA tuple
     @param  rgbtype  Valid valus are:
                          1 - Inputs are in the range 0 to 1
                        256 - Inputs are in the range 0 to 255

     @return A hex string in the form '#RRGGBB' or '#RRGGBBAA'
"""

  if len(vals)!=3 and len(vals)!=4:
    raise Exception("RGB or RGBA inputs to RGBtoHex must have three or four elements!")
  if rgbtype!=1 and rgbtype!=256:
    raise Exception("rgbtype must be 1 or 256!")

  #Convert from 0-1 RGB/RGBA to 0-255 RGB/RGBA
  if rgbtype==1:
    vals = [255*x for x in vals]

  #Ensure values are rounded integers, convert to hex, and concatenate
  return '#' + ''.join(['{:02X}'.format(int(round(x))) for x in vals])

print(RGBtoHex((0.1,0.3,  1)))
print(RGBtoHex((0.8,0.5,  0)))
print(RGBtoHex((  3, 20,147), rgbtype=256))
print(RGBtoHex((  3, 20,147,43), rgbtype=256))

1

Python 3.6中,您可以使用f字符串来使其更整洁:

rgb = (0,128, 64)
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}'

当然,您可以将其放入一个函数中,作为奖励,值会四舍五入并转换为int

def rgb2hex(r,g,b):
    return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}'

rgb2hex(*rgb)

1

您也可以使用效率很高的按位运算符,即使我怀疑您会担心像这样的效率。也比较干净。请注意,它不会限制或检查边界。至少从python 2.7.17开始就支持该功能

hex(r << 16 | g << 8 | b)

并对其进行更改,使其以#开头,您可以执行以下操作:

"#" + hex(243 << 16 | 103 << 8 | 67)[2:]

1

我真的很惊讶没有人建议这种方法:

对于Python 2和3:

'#' + ''.join('{:02X}'.format(i) for i in colortuple)

Python 3.6及更高版本:

'#' + ''.join(f'{i:02X}' for i in colortuple)

作为功​​能:

def hextriplet(colortuple):
    return '#' + ''.join(f'{i:02X}' for i in colortuple)

color = (0, 128, 64)
print(hextriplet(color))
#008040

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.