Frage

Wie kann ich eine RGB-Ganzzahl in der entsprechenden RGB-Tupel (R,G,B) konvertieren? Es scheint einfach genug, aber ich kann nichts auf Google finden.

Ich weiß, dass für jedes RGB (r,g,b) Sie die ganze Zahl n = r256^2 + g256 + b haben, wie kann ich das Gegenteil in Python, IE ein n gegeben lösen, muss ich die r, g, b Werte.

War es hilfreich?

Lösung

Ich bin kein Python-Experte mit allen Mitteln, aber soweit ich weiß, dass es die gleichen Operatoren wie C. hat

Wenn so sollte dies funktionieren und es sollte auch viel schneller sein als Modulo und Division verwendet wird.

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

Was sie tut es die niedrigste Byte jeweils zur Ausblendung (die binären und mit 255 .. Equals zu einem 8 einem Bit). Für die grüne und rote Komponente tut es das gleiche, aber verschiebt sich die Farbe-Kanal in die unterste Byte zuerst.

Andere Tipps

Aus RGB integer:

Blue =  RGBint mod 256
Green = RGBint / 256 mod 256
Red =   RGBint / 256 / 256 mod 256

Diese hübschen kann einfach implementiert, sobald Sie wissen, wie es zu bekommen. :)

Upd: hinzugefügt Python-Funktion. Nicht sicher, ob es ein besserer Weg, es zu tun, aber das funktioniert auf Python 3 und 2.4

def rgb_int2tuple(rgbint):
    return (rgbint // 256 // 256 % 256, rgbint // 256 % 256, rgbint % 256)

Es gibt auch eine hervorragende Lösung, dass Verwendungen bitshifting und Maskierung, dass kein Zweifel, viel schneller, dass Nils Pipenbrinck geschrieben.

>>> import struct
>>> str='aabbcc'
>>> struct.unpack('BBB',str.decode('hex'))
(170, 187, 204)

for python3:
>>> struct.unpack('BBB', bytes.fromhex(str))

und

>>> rgb = (50,100,150)
>>> struct.pack('BBB',*rgb).encode('hex')
'326496'

for python3:
>>> bytes.hex(struct.pack('BBB',*rgb))

Ich nehme an, Sie haben eine 32-Bit-Integer die RGB-Werte enthalten (z ARGB). Dann können Sie die binären Daten mit dem struct Modul auspacken:

# 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)
>>> r, g, b = (111, 121, 131)
>>> packed = int('%02x%02x%02x' % (r, g, b), 16)

Dies erzeugt die folgenden integer:

>>> packed
7305603

Sie können es dann auspacken entweder die lange explizite Art und Weise:

>>> packed % 256
255
>>> (packed / 256) % 256
131
>>> (packed / 256 / 256) % 256
121
>>> (packed / 256 / 256 / 256) % 256
111

.. oder in einer kompakteren Weise:

>>> b, g, r = [(packed >> (8*i)) & 255 for i in range(3)]
>>> r, g, b

Beispiel gilt mit einer beliebigen Anzahl von Ziffern, z RGBA Farbe:

>>> packed = int('%02x%02x%02x%02x' % (111, 121, 131, 141), 16)
>>> [(packed >> (8*i)) & 255 for i in range(4)]
[141, 131, 121, 111]

Nur ein Hinweis für alle, mit Googles App Engine Bilder Python-API. Ich fand ich eine Situation, wo ich hatte eine Methode mit einem 32-Bit-RGB-Farbwert zu liefern.

Insbesondere wenn Sie die API verwenden eine PNG (oder ein beliebiges Bild mit transparenten Pixeln) zu konvertieren, müssen Sie die execute_transforms Methode mit einem Argument aufgerufen transparent_substitution_rgb liefern, die eine 32-Bit-RGB-Farbwert sein muss .

In Anlehnung an dbr Antwort kam ich mit einem ähnlichen Verfahren wie das oben:

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))
def unpack2rgb(intcol):
    tmp, blue= divmod(intcol, 256)
    tmp, green= divmod(tmp, 256)
    alpha, red= divmod(tmp, 256)
    return alpha, red, green, blue

Wenn nur der divmod(value, (divider1, divider2, divider3…)) Vorschlag angenommen wurde, hätte es zu verschiedenen Zeitkonvertierungen vereinfacht.

Es gibt wahrscheinlich einen kürzeren Weg, dies zu tun:

dec=10490586
hex="%06x" % dec
r=hex[:2]
g=hex[2:4]
b=hex[4:6]
rgb=(r,g,b)

EDIT: das ist falsch - gibt die Antwort in Hex, wollte OP int. EDIT2. Raffiniertes Elend und Versagen zu reduzieren - benötigt ‚% 06x‘ hex, um sicherzustellen, wird immer als sechs Ziffern gezeigt [Dank an Peter Hansen Kommentar]

Wenn Sie NumPy verwenden und haben eine Reihe von RGBints, können Sie auch nur seine dtype verändern die roten, grünen, blauen und Alpha-Komponenten zu extrahieren:

>>> 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')

Hinzufügen zu dem, was oben erwähnt wird. Eine kurze Einzeiler Alternative.

# 2003199 or #E190FF is Dodger Blue.
tuple((2003199 >> Val) & 255 for Val in (16, 8, 0))
# (30, 144, 255)

Und jede Verwirrung in der Zukunft zu vermeiden.

from collections import namedtuple
RGB = namedtuple('RGB', ('Red', 'Green', 'Blue'))
rgb_integer = 16766720  # Or #ffd700 is Gold.
# The unpacking asterisk prevents a TypeError caused by missing arguments.
RGB(*((rgb_integer >> Val) & 255 for Val in (16, 8, 0)))
# RGB(Red=255, Green=215, Blue=0)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top