2015-10-02 8 views
7

Ich habe this image mit der Größe 128 x 128 Pixel und RGBA als Byte-Werte in meinem Speicher gespeichert. AberOpen PIL Bild von Byte-Datei

from PIL import Image 

image_data = ... # byte values of the image 
image = Image.frombytes('RGBA', (128,128), image_data) 
image.show() 

wirft die Ausnahme

ValueError: not enough image data

Warum? Was mache ich falsch?

+2

die Rohdaten in einem '. png 'Datei hat Header und Kompression und so, ich glaube nicht, dass Sie es in' frombytes' einspeisen können und ein kohärentes Ergebnis erhalten. – Kevin

+0

Wie werde ich das los? –

+0

Ich denke, Sie könnten das Bild mit 'Image.open (" homer.jpg ")' öffnen und dann 'tobytes' darauf aufrufen, um einen Puffer zu erhalten, der für' frombytes' geeignet ist ... Aber es gibt nicht viel Sinn darin tun 'image = Image.frombytes (Image.open (" homer.jpg "). tobytes())' wenn Sie einfach 'image = Image.open (" homer.jpg ")' 'tun können. Ich gehe davon aus, dass Ihr tatsächlicher Anwendungsfall komplizierter ist und Sie Letzteres aus irgendeinem Grund nicht tun können. – Kevin

Antwort

27

The documentation for Image.open sagt, dass es eine Datei-ähnliche Objekt annehmen kann, so sollten Sie aus dem bytes Objekt enthält das codierte Bild erstellt in einem io.BytesIO Objekt zu übergeben können:

from PIL import Image 
import io 

image_data = ... # byte values of the image 
image = Image.open(io.BytesIO(image_data)) 
image.show() 
+0

Muss 'Image.open' oder' io.BytesIO' nicht wissen, welches Bildformat irgendwie vergeben wird? – JeromeJ

+1

@JeromeJ Die meisten Bildformate haben eine Kopfzeile, die das verwendete Format identifiziert. Pillow verwendet das, um das Bild zu identifizieren. Ein Beispiel finden Sie unter [PNG-Header] (https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header). –

+0

Diese Antwort ist richtig, genau wie in der Dokumentation vorgeschlagen. Aber es ist mir immer noch nicht klar, was sie in der Dokumentation meinen "Beachten Sie, dass diese Funktion nur Pixeldaten dekodiert, nicht ganze Bilder." wenn auf die .fromBytes() -Methode verwiesen wird. Irgendwelche Ideen? – BluePython