如何将十六进制颜色值(如#ff3ab4
)转换为三元组RGB值(如(128, 255, 0)
)?
略前导零的原因是因为字符串被转换为数字,当您尝试再次将数字表示为字符串时,它不会显示任何前导 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))。这样,您可以清楚地看到 im 用于将单独的组件过滤为十六进制数字的位掩码。
我相当确定有一些像字符串格式化程序这样的东西也可以将数字表示为漂亮的字符串,但我从未使用过它们,所以我无法告诉您这些解决方案的外观如何:)
编辑:如果您不清楚我使用的位掩码是如何工作的,这里有一个(希望)简单的例子:假设您有 2 个字节的数据以位形式表示:
bytes0 = 0011 0101
bytes1 = 0000 1111
&
运算符是按位 AND 运算符。
bytesAND = bytes0 & bytes1
bytesAND
现在看起来像这样:
0000 0101
>>> 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 个字节