#ff3ab4
16 進数の色の値 ( など) を のような 3 タプルの RGB 値に変換するにはどうすればよい(128, 255, 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
これは決してパフォーマンス面で最適化されていないことに注意してください。:) すぐに整数を使用する必要があります (int("0xFF000000", 16) の代わりに 255 を使用するなど)。この方法では、個別のコンポーネントを 16 進数として除外するために使用しているビットマスクがはっきりとわかります。
数値をきれいな文字列として表現するための仕事をする文字列フォーマッタのようなものがあることはかなり確信していますが、私はそれらを使用したことがないので、それらを使用したソリューションがどのように見えるかはわかりません:)
編集:私が使用したビットマスクがどのように機能するかが不明な場合は、(できれば)簡単な例を次に示します:ビット形式で表された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 番目のバイト