2015-10-02 3 views
7

У меня есть this image размером 128 x 128 пикселей и RGBA, хранящиеся в памяти как значения байтов. НоОткрытое изображение PIL из файла байта

from PIL import Image 

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

бросает исключение

ValueError: not enough image data

Почему? Что я делаю не так?

+2

необработанных данных в '. png' имеет заголовки и сжатие и прочее, поэтому я не думаю, что вы можете прокормить его в 'frombytes' и получить согласованный результат. – Kevin

+0

Как я могу избавиться от этого? –

+0

Я думаю, вы могли бы открыть изображение с помощью Image.open ("homer.jpg") ', а затем называть' tobytes' на нем, чтобы получить буфер, подходящий для перехода в 'frombytes' ... Но не так много смысла в делаю 'image = Image.frombytes (Image.open (" homer.jpg "). tobytes())', когда вы можете просто сделать 'image = Image.open (" homer.jpg ")'. Я предполагаю, что ваш фактический прецедент более сложный, и вы не можете сделать последнее по какой-то причине. – Kevin

ответ

27

The documentation for Image.open говорит, что он может принимать файл-подобный объект, так что вы должны быть в состоянии передать в io.BytesIO объекте, созданном из bytes объекта, содержащего закодированное изображение:

from PIL import Image 
import io 

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

Не нужно ли 'Image.open' или' io.BytesIO' знать, какой формат изображения ему дается? – JeromeJ

+1

@JeromeJ В большинстве форматов изображений есть заголовок, который идентифицирует используемый формат. Подушка использует это для идентификации изображения. См. [Заголовок PNG] (https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header) для примера. –

+0

Этот ответ правильный, как указано в документации. Но мне все еще не ясно, что они означают в документации, «Обратите внимание, что эта функция декодирует только пиксельные данные, а не целые изображения». при обращении к методу .fromBytes(). Есть идеи? – BluePython

Смежные вопросы