web-dev-qa-db-ja.com

RGB IntからRGB-Python

RGB整数を対応するRGBタプルに変換するにはどうすればよいですか(R,G,B)?シンプルなようですが、Googleでは何も見つかりません。

RGBごとに(r,g,b)整数を持っていますn = r256^2 + g256 + b、Pythonで逆を解決するにはどうすればよいですか、IE nを指定すると、rgb値。

17
Omar

私はPython=エキスパートではありませんが、Cと同じ演算子を持っています。

もしそうなら、これはうまくいくはずであり、また、モジュロと除算を使用するよりもはるかに速いはずです。

Blue =  RGBint & 255
Green = (RGBint >> 8) & 255
Red =   (RGBint >> 16) & 255

それぞれの場合の最下位バイトをマスクするために何をするか(バイナリと255 .. 8の1ビットに等しい)。緑と赤のコンポーネントの場合も同じですが、最初にカラーチャネルを最下位バイトにシフトします。

46

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が投稿したものよりはるかに高速です。

15
Xorlev
>>> 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))
9
adamk
>>> 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]
7
dbr

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)
6
AndiDog

GoogleのAppengine画像Python APIを使用しているすべての人へのメモです。32ビットRGBカラー値を持つメソッドを提供しなければならない状況がありました。

具体的には、APIを使用してPNG(または透明ピクセルを含む任意の画像)を変換する場合は、execute_transformsメソッドに、32ビットRGBカラー値であるtransparent_substitution_rgbと呼ばれる引数を指定する必要があります。

Dbrの答えを借りて、次のような方法を思いつきました。

def RGBTo32bitInt(r, g, b):
  return int('%02x%02x%02x' % (r, g, b), 16)

transformed_image = image.execute_transforms(output_encoding=images.JPEG, transparent_substitution_rgb=RGBTo32bitInt(255, 127, 0))
3
chris butcher
_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…))提案のみが受け入れられた場合、さまざまな時間変換も簡略化されます。

2
tzot

これを行うには、おそらくもっと短い方法があります。

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のコメントに感謝します]。

0
monojohnny