将HTML HEX颜色或RGB元组转换为X11颜色

2 投票
4 回答
2538 浏览
提问于 2025-04-17 09:51

我在找一个简单的函数,可以把RGB颜色值(比如255, 255, 255)或者HTML的十六进制颜色值(比如#FFFFFF)转换成X11颜色值(范围是0...255的整数),这样我就能在Unix终端里管理颜色了。我在网上查了很久,但没找到类似的东西,所以我想问问有没有代码或者网站链接,能告诉我怎么用Python实现这个功能。

4 个回答

1

你不能自动转换成x11颜色。

x11颜色其实就是一些名字和随意的RGB值对应起来,所以要从RGB转换到x11,唯一的方法就是反向查找这个对应关系。

如果你想把一个不在x11里的RGB颜色转换成最接近的x11颜色,那会比较困难。

1

如果我理解你的问题没错的话,我觉得你可能无法做到这一点。RGB元组(还有它在HTML中表示的6位十六进制数字)代表了RGB颜色空间中的一种特定颜色。而你提到的在Unix终端中0到255之间的单个整数并不是一种特定的颜色,而是一个颜色表中的索引。举个例子,某个终端上的颜色15可能是#ff0000(红色),但在另一个终端上可能是#33ff33(绿色)。这两者之间实际上没有直接的转换关系。

1

正如@chepner和@Shawabawa提到的那样,RGB颜色代码的三元组或者六位十六进制数并不能直接映射到一个8位的数字(范围是0到255)。如果能做到这一点,就会丢失一些信息,因为这种映射是多对一的。不过,你可以使用(BASH)颜色代码作为起点,来编写一个Python脚本。例如,使用以下变量:

txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
badgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

你可以把它放到一个脚本里,也就是:

cmd    = "export PS1='%s'"
prompt = "%s foo %s bar : "
prompt = prompt % (undred, txtblu)
print cmd % prompt

当我运行这个输出时,我得到的结果是:

t@hydrogen:~/test/color$ python test.py 
export PS1='\e[4;31m foo \e[0;34m bar : '
t@hydrogen:~/test/color$ export PS1='\e[4;31m foo \e[0;34m bar : '
foo  bar : 

现在,foo是红色并且带下划线,而bar是蓝色。

撰写回答