RGB整数を対応するRGBタプルに変換するにはどうすればよい(R,G,B)
ですか? 簡単に思えますが、Googleで何も見つかりません。
RGBごと(r,g,b)
に整数があることを知っています.Pythonでn = r256^2 + g256 + b
逆を解決するにはどうすればよいですn
か.r
g
b
私は決して Python の専門家ではありませんが、私が知る限り、C と同じ演算子があります。
もしそうなら、これは機能し、モジュロと除算を使用するよりもはるかに高速になるはずです。
Blue = RGBint & 255
Green = (RGBint >> 8) & 255
Red = (RGBint >> 16) & 255
それぞれの場合に最下位バイトをマスクするために行うこと (バイナリと 255.. 8 つの 1 ビットに等しい)。緑と赤のコンポーネントについても同じことを行いますが、最初にカラー チャネルを最下位バイトにシフトします。
RGB 整数から:
Blue = RGBint mod 256
Green = RGBint / 256 mod 256
Red = RGBint / 256 / 256 mod 256
これは、取得方法がわかれば、非常に簡単に実装できます。:)
更新: python 関数を追加しました。もっと良い方法があるかどうかはわかりませんが、これは Python 3 と 2.4 で動作します
def rgb_int2tuple(rgbint):
return (rgbint // 256 // 256 % 256, rgbint // 256 % 256, rgbint % 256)
Nils Pipenbrinck が投稿したビットシフトとマスキングを使用する優れたソリューションもあります。
>>> import struct
>>> str='aabbcc'
>>> struct.unpack('BBB',str.decode('hex'))
(170, 187, 204)
for python3:
>>> struct.unpack('BBB', bytes.fromhex(str))
と
>>> rgb = (50,100,150)
>>> struct.pack('BBB',*rgb).encode('hex')
'326496'
for python3:
>>> bytes.hex(struct.pack('BBB',*rgb))
>>> r, g, b = (111, 121, 131)
>>> packed = int('%02x%02x%02x' % (r, g, b), 16)
これにより、次の整数が生成されます。
>>> packed
7305603
その後、長い明示的な方法で解凍できます。
>>> packed % 256
255
>>> (packed / 256) % 256
131
>>> (packed / 256 / 256) % 256
121
>>> (packed / 256 / 256 / 256) % 256
111
..またはよりコンパクトな方法で:
>>> b, g, r = [(packed >> (8*i)) & 255 for i in range(3)]
>>> r, g, b
サンプルは、RGBA カラーなど、任意の桁数で適用されます。
>>> packed = int('%02x%02x%02x%02x' % (111, 121, 131, 141), 16)
>>> [(packed >> (8*i)) & 255 for i in range(4)]
[141, 131, 121, 111]
RGB 値 (ARGB など) を含む 32 ビット整数があると仮定します。struct
次に、モジュールを使用してバイナリ データを展開できます。
# Create an example value (this represents your 32-bit input integer in this example).
# The following line results in exampleRgbValue = binary 0x00FF77F0 (big endian)
exampleRgbValue = struct.pack(">I", 0x00FF77F0)
# Unpack the value (result is: a = 0, r = 255, g = 119, b = 240)
a, r, g, b = struct.unpack("BBBB", exampleRgbValue)
def unpack2rgb(intcol):
tmp, blue= divmod(intcol, 256)
tmp, green= divmod(tmp, 256)
alpha, red= divmod(tmp, 256)
return alpha, red, green, blue
提案だけが受け入れられれば、divmod(value, (divider1, divider2, divider3…))
さまざまな時間変換も単純化されたでしょう。
NumPy を使用していて、RGBint の配列がある場合は、その dtype を変更して、赤、緑、青、およびアルファ コンポーネントを抽出することもできます。
>>> type(rgbints)
numpy.ndarray
>>> rgbints.shape
(1024L, 768L)
>>> rgbints.dtype
dtype('int32')
>>> rgbints.dtype = dtype('4uint8')
>>> rgbints.shape
(1024L, 768L, 4L)
>>> rgbints.dtype
dtype('uint8')
おそらくこれを行うより短い方法があります:
dec=10490586
hex="%06x" % dec
r=hex[:2]
g=hex[2:4]
b=hex[4:6]
rgb=(r,g,b)
編集:これは間違っています-16進数で答えを返します.OPはintを望んでいました. EDIT2: 悲惨さと失敗を減らすために洗練されました - 16 進数が常に 6 桁として表示されるようにするために「%06x」が必要です [Peter Hansen のコメントに感謝します]。