【python】关于颜色码的几种常用表示及其相互转换

关于颜色码的几种常用表示及其相互转换

  在前面一篇博文【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)166BGR0x0000FF
接着,将十六进制六位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 0x0000FF0xFFFFFF=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]

猜你喜欢

转载自blog.csdn.net/weixin_37577134/article/details/89050272