2015-10-02 10 views
7

Ho this image con dimensioni 128 x 128 pixel e RGBA memorizzati come valori di byte nella memoria. MaImmagine PIL aperta dal file di byte

from PIL import Image 

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

genera l'eccezione

ValueError: not enough image data

Perché? Che cosa sto facendo di sbagliato?

+2

i dati grezzi in un '. il file png' ha intestazioni e compressione e roba, quindi non penso che tu possa nutrirlo in 'frombytes' e ottenere un risultato coerente. – Kevin

+0

Come sbarazzarsi di questo? –

+0

Immagino che tu possa aprire l'immagine con 'Image.open (" homer.jpg ")', e poi chiamare 'tobytes' su di esso per ottenere un buffer adatto per passare a' frombytes' ... Ma non ha molto senso facendo 'image = Image.frombytes (Image.open (" homer.jpg "). tobytes())' quando puoi semplicemente fare 'image = Image.open (" homer.jpg ")'. Suppongo che il tuo caso d'uso reale sia più complicato e non puoi farlo per qualche ragione. – Kevin

risposta

27

The documentation for Image.open dice che può accettare un oggetto simile a file, così si dovrebbe essere in grado di passare in un oggetto io.BytesIO creata dall'oggetto bytes che contiene l'immagine codificata:

from PIL import Image 
import io 

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

Non 'Image.open' o' io.BytesIO' ha bisogno di sapere quale formato di immagine viene dato in qualche modo? – JeromeJ

+1

@JeromeJ La maggior parte dei formati di immagine ha un'intestazione che identifica il formato in uso. Il cuscino usa quello per identificare l'immagine. Vedi [l'intestazione PNG] (https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header) per un esempio. –

+0

Questa risposta è giusta, proprio come suggerito nella documentazione. Ma non mi è ancora chiaro cosa intendano nella documentazione con "Notare che questa funzione decodifica solo i dati dei pixel, non le intere immagini". quando si fa riferimento al metodo .fromBytes(). Qualche idea? – BluePython