如何在Python中将十六进制颜色值转换为RGB

时间:2012-06-18 07:23:17

标签: python rgb rgba

如何将十六进制颜色值(如#ff3ab4)转换为三元组RGB值,如(128, 255, 0)

2 个答案:

答案 0 :(得分:2)

省略前导零的原因是因为字符串被转换为数字,当你试图再次将数字表示为字符串时,它不会显示任何前导0,因为数字不是有一定的长度,不知道它起源于一个字符串,而字符串又有一定的长度。

在您的情况下,我假设您希望将单独的A,R,B和G部分作为格式良好的字符串返回。如果您想手动执行此操作,我会执行以下操作:

def colorComponents(hexAsString):
    def uniformLength(string):
        return string[:2] + "".zfill(10-len(string)) + string[2:]
    re = []
    re.append(str(hex(int(hexAsString, 16) & int("0xFF000000", 16))))
    re.append(str(hex(int(hexAsString, 16) & int("0x00FF0000", 16))))
    re.append(str(hex(int(hexAsString, 16) & int("0x0000FF00", 16))))
    re.append(str(hex(int(hexAsString, 16) & int("0x000000FF", 16))))

    for i in range(len(re)):
        re[i] = uniformLength(re[i])
    return re

请注意,这在任何方面都没有在性能方面进行优化。 :) 你应该立即使用整数(比如使用255而不是int(“0xFF000000”,16))。这种方式虽然您可以清楚地看到我使用的位掩码将单独的组件过滤为十六进制数字。

我相当确定有类似字符串格式化程序的东西可以完成将数字表示为漂亮的字符串,但我从来没有使用它们所以我不能告诉你这些解决方案将如何看起来像:)

编辑: 如果您不清楚我使用的位掩码是如何工作的,这是一个(希望)简单的例子: 假设您有2个字节的数据以其位形式表示:

bytes0 = 0011 0101
bytes1 = 0000 1111

&运算符是一个按位运算符。

bytesAND = bytes0 & bytes1

bytesAND现在看起来像这样:

0000 0101

答案 1 :(得分:1)

>>> bit32_to_bytes = lambda x: [255 & (x >> 8 * i) for i in (0,1,2,3)]
>>> bit32_to_bytes(0xFFEE2200)
[0L, 34L, 238L, 255L]

一些解释:

>>> bin(0xFF00)
'0b1111111100000000' # this is string, not a number
>>> bin(0xFF00 >> 8) # shift right by 8 bits
'0b11111111' # leading zeros striped
>>> bin(0xA0FF00)
'0b101000001111111100000000' # 24-bit number
>>> bin(0xA0FF00 >> 8) # shift by 1 byte (drop the lowest byte)
'0b000000001010000011111111' # leading zeros added by myself!
>>> bin(255 & (0xA0FF00 >> 8)) # shift right (by 1 byte) and mask (get last byte)
'0b000000000000000011111111' # leading zeros added by myself!

屏蔽y = 255 & x后,y会收到数字x中低字节的值。 y = 255 & (x >> 8 * n) - > y = x

中的第n个字节