关于颜色码的几种常用表示及其相互转换
在前面一篇博文【python】xlwings如何设置字体、颜色等属性中,最后提出的一个关于颜色码的问题。本篇博文旨在讨论颜色码的一些表示方式,并且给出转换的python源码。由于xlwings包在修改字体颜色时,主要使用BGR颜色码,本篇主要针对BGR颜色码的一些表示方法展开讨论,并且给出相应的BGR颜色码转换python源码。
1. RGB颜色码
这种表示方式是最常用,也是我们最容易接受的表示方式。RGB颜色码是一个包含3个元素的tuple,第1位表示红色,第2位表示绿色,第3位表示蓝色。
例如:(255,0,0) --> 红色;(0,255,0) --> 绿色;(0,0,255) --> 蓝色
2. BGR颜色码
使用opencv进行图像处理的朋友一定知道,opencv在读取图像的时候是按照BGR的颜色码来读取图像的。BGR颜色码是一个包含3个元素的tuple,第1位表示蓝色,第2位表示绿色,第3位表示红色。
例如:(255,0,0) --> 蓝色;(0,255,0) --> 绿色;(0,0,255) --> 红色
3. 十六进制六位RGB颜色码
这种表示方式也很常用,也很好理解。6位十六进制数,高两位表示红色,中间两位表示绿色,低两位表示蓝色。
例如:0xFF0000 --> 红色;0x00FF00 --> 绿色;0x0000FF --> 蓝色
4. 十六进制六位BGR颜色码
有十六进制六位RGB颜色码,同理就有十六进制六位BGR颜色码。6位十六进制数,高两位表示蓝色,中间两位表示绿色,低两位表示红色。
例如:0xFF0000 --> 蓝色;0x00FF00 --> 绿色;0x0000FF --> 红色
5. 十进制正数BGR颜色码
十进制正数BGR颜色码很简单,就是十六进制六位BGR颜色码直接转换为十进制就得到了。
6. 十进制负数BGR颜色码
在@帅胡的博文[1]中,设置字体颜色的时候颜色的赋值是十进制的负数BGR颜色码。十进制负数BGR颜色码也是一种常用的计算机颜色码之一,但是十进制负数BGR颜色码的表示方法相对前面几种表示方式就比较难以理解,而且从数值的角度很难直接看出端倪。
上一点中介绍了十六进制六位BGR颜色码,在本小点中就简单介绍一下十六进制六位BGR颜色码和十进制负数BGR颜色码如何相互转换。以纯红色为例子:
B G R 16 进 制 6 位 B G R ( 0 , 0 , 255 ) ↔ 0 x 0000 F F \begin{array}{ccc} \sf{BGR} & & \sf{16进制6位BGR} \\ \hline \\ (0,0,255) & \leftrightarrow & \sf{0x0000FF} \end{array} BGR(0,0,255)↔16进制6位BGR0x0000FF
接着,将十六进制六位BGR颜色码和0xFFFFFF进行异或运算:
0 x 0000 F F ⊕ 0 x F F F F F F = 0 x F F F F 00 = 16776960 \sf{0x0000FF}\oplus\sf{0xFFFFFF}=\sf{0xFFFF00}=16776960 0x0000FF⊕0xFFFFFF=0xFFFF00=16776960
最后对得到的十进制数值进行取反运算,得到对应的十进制负数BGR颜色码:
∼ ( 16776960 ) = − 16776961 \sim(16776960)=-16776961 ∼(16776960)=−16776961
BGR颜色码转换python程序
下面给出几种BGR颜色码之间的转换python源码。
1. RGB颜色码转BGR颜色码
def RGB2BGR(rgb_tuple):
assert isinstance(rgb_tuple, tuple)
assert len(rgb_tuple) == 3
r = rgb_tuple[0]
g = rgb_tuple[1]
b = rgb_tuple[2]
return (b, g, r)
2. BGR颜色码转16进制6位BGR颜色码
def BGR2BGR_hex(bgr_tuple):
assert isinstance(bgr_tuple, tuple)
assert len(bgr_tuple) == 3
b = bgr_tuple[0]
g = bgr_tuple[1]
r = bgr_tuple[2]
bgr_hex = hex(b*16**4 + g*16**2 + r)
return bgr_hex
3. 16进制6位BGR颜色码转BGR颜色码
def BGR_hex2BGR(bgr_hex):
bgr_int = int(bgr_hex)
b = bgr_int // 16**4
g = (bgr_int - b*16**4) // 16**2
r = bgr_int - b*16**4 - g*16**2
return (b, g, r)
4. 16进制6位BGR颜色码转十进制负数BGR颜色码
def BGR_hex2BGR_negative(bgr_hex):
bgr_negative = ~(bgr_hex ^ 0xffffff)
return bgr_negative
5. 十进制负数BGR颜色码转16进制6位BGR颜色码
def BGR_negative2BGR_hex(bgr_negative):
bgr_hex = hex(~bgr_negative ^ 0xffffff)
return bgr_hex
参考资料
[1] @帅胡, 利用 pywin32 操作 excel
[2] @龙爷linux, 颜色值为负数
[3] @feiyangxiaomi, android系统提供的几种颜色Color
联系我
如有疑问,邮件是最快联系我的方式:[email protected]