0

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

4

2 回答 2

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

&运算符是按位 AND 运算符。

bytesAND = bytes0 & bytes1

bytesAND现在看起来像这样:

0000 0101
于 2012-06-18T08:04:11.680 回答
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 & xy接收数字中低字节的值xy = 255 & (x >> 8 * n)-> y = x 的第 n 个字节

于 2012-06-18T07:44:45.303 回答