2015-10-02 25 views
7

Mam this image o rozmiarze 128 x 128 pikseli i RGBA przechowywane jako wartości bajtów w mojej pamięci. AleOtwórz obraz PIL z pliku bajtowego

from PIL import Image 

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

rzuca wyjątek

ValueError: not enough image data

Dlaczego? Co ja robię źle?

+2

dane surowe w '. Plik png ma nagłówki i kompresję i inne rzeczy, więc nie sądzę, że możesz je wprowadzić do 'frombytes' i uzyskać spójny wynik. – Kevin

+0

Jak się tego pozbyć? –

+0

Myślę, że możesz otworzyć obrazek za pomocą 'Image.open (" homer.jpg ")', a następnie wywołać 'tobytes' na nim, aby uzyskać bufor odpowiedni do przekazania' frombytes' ... Ale nie ma sensu robienie 'image = Image.frombytes (Image.open (" homer.jpg "). tobytes())' gdy możesz po prostu zrobić 'image = Image.open (" homer.jpg ")'. Zakładam, że twój faktyczny przypadek użycia jest bardziej skomplikowany i nie możesz tego zrobić z jakiegoś powodu. – Kevin

Odpowiedz

27

The documentation for Image.open mówi, że może przyjąć obiekt plikopodobny, więc powinieneś być w stanie przejść w io.BytesIO obiektu stworzonego z obiektu bytes zawierającego zakodowany obraz:

from PIL import Image 
import io 

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

Czy 'Image.open' ani' io.BytesIO' nie musi wiedzieć, jaki format obrazu jest w jakiś sposób podany? – JeromeJ

+1

@JeromeJ Większość formatów graficznych ma nagłówek identyfikujący używany format. Poduszka używa tego do identyfikacji obrazu. Zobacz [nagłówek PNG] (https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header) na przykład. –

+0

Ta odpowiedź jest zgodna z zaleceniami przedstawionymi w dokumentacji. Ale nadal nie jest dla mnie jasne, co oznaczają w dokumentacji przez "Zauważ, że ta funkcja dekoduje tylko dane pikselowe, a nie całe obrazy". odnosząc się do metody .fromBytes(). Jakieś pomysły? – BluePython