Подтвердить что ты не робот

Как создать изображение из строки в python

В настоящее время у меня возникают проблемы с созданием образа из двоичной строки данных в моей программе Python. Я получаю двоичные данные через сокет, но когда я пытаюсь использовать методы, которые я читал на здесь, выполните следующие действия:

buff = StringIO.StringIO() #buffer where image is stored
#Then I concatenate data by doing a 
buff.write(data) #the data from the socket
im = Image.open(buff)

Я получаю исключение от эффекта "тип изображения не распознан". Я знаю, что правильно получаю данные, потому что, если я пишу изображение в файл, а затем открываю файл, он работает:

buff = StringIO.StringIO() #buffer where image is stored
buff.write(data) #data is from the socket
output = open("tmp.jpg", 'wb')
output.write(buff)
output.close()
im = Image.open("tmp.jpg")
im.show()

Я полагаю, что я, вероятно, что-то неправильно делаю с использованием класса StringIO, но я не уверен

4b9b3361

Ответ 1

Я подозреваю, что вы не seek возвращаетесь в начало буфера, прежде чем передать объект StringIO в PIL. Здесь некоторый код демонстрирует проблему и решение:

>>> buff = StringIO.StringIO()
>>> buff.write(open('map.png', 'rb').read())
>>> 
>>> #seek back to the beginning so the whole thing will be read by PIL
>>> buff.seek(0)
>>>
>>> Image.open(buff)
<PngImagePlugin.PngImageFile instance at 0x00BD7DC8>
>>> 
>>> #that worked.. but if we try again:
>>> Image.open(buff)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\python25\lib\site-packages\pil-1.1.6-py2.5-win32.egg\Image.py", line 1916, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file

Перед чтением любых объектов StringIO убедитесь, что вы вызываете buff.seek(0). В противном случае вы будете читать с конца буфера, который будет выглядеть как пустой файл и, вероятно, приведет к ошибке, которую вы видите.

Ответ 2

Вы либо вызываете buff.seek(0), либо, лучше, инициализируете буфер памяти данными StringIO.StringIO(data).