将 RGB 颜色元组转换为十六进制字符串

我需要将 (0, 128, 64)转换成类似于这样的 "#008040"。我不知道怎么称呼后者,这使得搜索变得困难。

147511 次浏览

使用格式操作符 %:

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

注意,它不会检查边界..。

>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'
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

更新 添加钳功能,如下所示。

更新 从问题的标题和给定的上下文来看,很明显,在[0,255]中需要3个整数,并且当传递3个这样的整数时总是返回一个颜色。然而,从评论中可以看出,这一点可能不是每个人都能看出来的,因此,我们应该明确指出:

提供三个 int值,这将返回一个表示颜色的有效十六进制三元组。如果这些值介于[0,255]之间,那么它将把这些值视为 RGB 值,并返回与这些值对应的颜色。

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)))

这是一个老问题了,但是为了了解更多信息,我开发了一个包,其中包含了一些与颜色和颜色地图相关的实用程序,并且包含了 rgb2hex 函数,你可以在其他很多包中找到这个函数,比如 matplotlib。在皮皮上

pip install colormap

然后

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

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

我已经为它创建了一个完整的 python 程序,下面的函数可以将 rgb 转换为十六进制,反之亦然。

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 转换为十六进制和十六进制转换为 RGB

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)
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)


background = RGB(0, 128, 64)

我知道 Python 中的一行程序不一定受到友好的对待。但是有时候我忍不住要利用 Python 解析器所允许的优势。这个答案与 Dietrich Epp 的解决方案(最好的)相同,但是包含在一个单行函数中。所以,谢谢你,迪特里希!

我现在用它和 tkinter: -)

下面是一个更完整的函数,用于处理在 [0,1][0,255]范围内可能有 RGB 值的情况。

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))

注意,这只适用于 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

您可以使用 lambda 和 f-string (在 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 Ex2rgb (“ # 十六进制”) # output = (r,g,b) hexcolor 必须为 # 十六进制格式

您也可以使用位智能运算符,这是相当有效的,即使我怀疑您会担心这样的东西的效率。也相对干净。请注意,它不夹或检查界限。这至少从 Python 2.7.17 开始就得到了支持。

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

然后改变它,让它以一个 # 开始,你可以这样做:

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

有一个软件包称为网页颜色

它有一个 webcolors.rgb_to_hex方法

>>> import webcolors
>>> webcolors.rgb_to_hex((12,232,23))
'#0ce817'

我真的很惊讶没有人提出这种方法:

对于 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
''.join('%02x'%i for i in input)

可用于从整型数的十六进制转换

如果输入格式化字符串 的次数看起来有点冗长..。

位移和 f 字符串的组合可以很好地完成这项工作:

# Example setup.
>>> r, g, b = 0, 0, 195


# Create the hex string.
>>> f'#{r << 16 | g << 8 | b:06x}'
'#0000c3'

这也说明了一种方法,通过这种方法,如果红色或绿色通道为零,则不会丢弃“前导”零位。

我的课程任务要求不使用 for 循环和其他东西,这是我奇怪的解决方案 lol。

color1 = int(input())
color2 = int(input())
color3 = int(input())


color1 = hex(color1).upper()
color2 = hex(color2).upper()
color3 = hex(color3).upper()




print('#'+ color1[2:].zfill(2)+color2[2:].zfill(2)+color3[2:].zfill(2))