将HTML HEX颜色或RGB元组转换为X11颜色
我在找一个简单的函数,可以把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是蓝色。