如何将 RGB 颜色打印到终端

3

ANSI转义码SGR 38 - 使用参数2;r;g;b设置前景色,能否与打印函数一起使用? 当然,使用代码33的示例是

OKBLUE = '\033[94m'

我想使用038,以便能够使用任何RGB颜色。那可行吗?

我已经尝试过了。

GREEN = '\038[2;0;153;0m'
ENDC = '\033[0m'
    
print(f"{GREEN} some text {ENDC}")

期望将“一些文本”的颜色更改为绿色


这是一个f字符串吗?f应该在外面。 - Ahmad Anis
2
"\033"是代表“转义”的八进制字符,由于八进制是基于8的,因此不存在"\038"字符。 - S3DEV
你仍然需要使用\033作为8位SGR代码的转义字符。控制权在38之内,进入转义序列。您可以参考此维基页面中的“描述> SGR参数>颜色> 8位”部分以获取更多详细信息。 - S3DEV
Python 可以发出任何字节,但它们的作用取决于您正在通信的终端驱动程序或硬件的能力。 - tripleee
根据上面的维基页面,我理解在SGR(选择图形呈现)参数表中,\033来自于: 30-37 设置前景色。 这就是我想要使用的行,其中包括: 38 设置前景色 下一个参数是5;n或2;r;g;b。 所以我想到应该用38替换33并添加额外的参数。从您的评论中,我了解到需要同时使用\033和\038。对吗?我认为我同意@tripleee的看法。 - Lupascu Gabriel Cristian
@LupascuGabrielCristian - 我刚刚提供了一个正确的答案,以帮助澄清任何误解并提供一个可工作的代码示例。 - S3DEV
3个回答

6

要在终端中使用RGB色彩空间*,可以使用以下转义序列:

# Print Hello! in lime green text.
print('\033[38;2;146;255;12mHello!\033[0m')
#           ^
#           |
#           \ The 38 goes here, to indicate a foreground colour.

# Print Hello! in white text on a fuschia background.
print('\033[48;2;246;45;112mHello!\033[0m') 

解释:

\033[38;2;146;255;12mHello!\033[0m
^     ^ ^  ^   ^   ^   ^     ^   ^ 
|     | |  R   G   B   |     |   |
|     | |  |           |     |   \ Reset the colour to default
|     | |  |           |     | 
|     | |  |           |     \ Escape character
|     | |  |           |
|     | |  \ R;G;B     \ Text to print
|     | |
|     | \ Indicate the following sequence is RGB
|     |
|     \ Code to instruct the setting of an 8 or 24-bit foreground (text) colour
|
\ Escape character

使用38;2表示后面会跟随一个RGB(前景色)序列。而使用38;5则表示后面的(前景)颜色值来自于256色表
为了澄清一些误解,\033(八进制)或\x1b(十六进制)对应ASCII表中的ESC字符,用于引入终端文本着色的转义序列。而38用于指示接下来的8或24位颜色被设置为前景色,(在转义序列被引入之后)。此外,48可以用于设置背景色,就像上面的代码示例一样。
*提供终端模拟器支持24位色序列。(例如Xterm、GNOME终端等)
链接到维基百科文章,深入解释了这个24位色(RGB)主题。

2
完全透明地说,我是Colorist包的作者。Colorist是一个轻量级的、简洁的包,支持开箱即用的RGB颜色。只需使用pip install colorist安装该包,并输入以下命令:
from colorist import ColorRGB, BgColorRGB

dusty_pink = ColorRGB(194, 145, 164)
bg_steel_blue = BgColorRGB(70, 130, 180)

print(f"I want to use {dusty_pink}dusty pink{dusty_pink.OFF} and {bg_steel_blue}steel blue{bg_steel_blue.OFF} colors inside this paragraph")

Examples of RGB color in terminal

如果你更喜欢使用HSL来定义颜色,那也是可以的,因为Colorist会将其转换为RGB。
from colorist import ColorHSL, BgColorHSL

mustard_green = ColorHSL(60, 56, 43)
bg_steel_gray = BgColorHSL(190, 2, 49)

print(f"I want to use {mustard_green}mustard green{mustard_green.OFF} and {bg_steel_gray}steel blue{bg_steel_gray.OFF} colors inside this paragraph")

Examples of HSL color in terminal

或者类似地,你也可以用十六进制来定义颜色:
from colorist import ColorHex, BgColorHex

watermelon_red = ColorHex("#ff5733")
bg_mint_green = BgColorHex("#99ff99")

print(f"I want to use {watermelon_red}watermelon pink{watermelon_red.OFF} and {bg_mint_green}mint green{bg_mint_green.OFF} colors inside this paragraph")

Examples of Hex color in terminal

请注意,并非所有终端都支持高级RGB颜色,因为它们并不是最初的ANSI规范的一部分。您可能需要尝试不同的终端,找到适合您的那一个。

-3
以下代码将给您一个想法。
print('\033[90m' + 'hello' + '\033[96m' + ' there?' )

OP的问题涉及使用24位(RGB)颜色。1)这展示了3位和4位颜色,正如OP的问题所示。2)记得在序列结束时重置颜色,否则接下来的任何文本都将是相同的颜色。 - S3DEV
是的,你说得对。 - su yong kim

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