после того, как PIL.Image.tostring() не может идентифицировать файл изображения

Я хочу использовать string для хранения данных изображения.

Фон: в некоторых других частях кода я загружаю изображения, которые были загружены из Интернета и сохранены как string с помощью

imgstr = urllib2.urlopen(imgurl).read()
PIL.Image.open(StringIO.StringIO(imstr))

Теперь я делаю некоторые манипуляции с изображением с объектом PIL.Image. Я также хочу преобразовать эти объекты в тот же string-формат, чтобы их можно было использовать в исходном коде.

Это то, что я пробовал.

>>> import PIL
>>> import StringIO

>>> im = PIL.Image.new("RGB", (512, 512), "white")
>>> imstr=im.tostring()

>>> newim=PIL.Image.open(StringIO.StringIO(imstr))
Traceback (innermost last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2006, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file

Я нашел подсказки в Интернете, что это может произойти. например Python PIL: как записать изображение PNG в строку Однако я не смог извлечь правильное решение для своего примера кода.

Следующая попытка была:

>>> imstr1 = StringIO.StringIO()
>>> im.save(imstr1,format='PNG')
>>> newim=PIL.Image.open(StringIO.StringIO(imstr1))
Traceback (innermost last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2006, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file

person BerndGit    schedule 26.03.2015    source источник
comment
Метод tostring() не создает формат файла изображения; он создает необработанные данные изображения. Вы можете загрузить это снова только с помощью `. Какую цель вы преследовали, сохранить изображение в определенном формате в файловый объект в памяти?   -  person Martijn Pieters    schedule 27.03.2015
comment
Если это так, вы хотите Python PIL: как записать изображение PNG в строку   -  person Martijn Pieters    schedule 27.03.2015
comment
Спасибо за ваш чрезвычайно быстрый ответ. Я ответил на ваши вопросы, отредактировав свой пост.   -  person BerndGit    schedule 27.03.2015


Ответы (1)


Вам не нужно оборачивать существующий объект StringIO в другой такой же объект; imstr1 уже является файловым объектом. Все, что вам нужно сделать, это вернуться к началу:

imstr1 = StringIO.StringIO()
im.save(imstr1, format='PNG')
imstr1.seek(0)
newim = PIL.Image.open(imstr1)

Вы можете получить строку байтов из объекта StringIO с помощью метода StringIO.getvalue()< /а>:

imstr1 = StringIO.StringIO()
im.save(imstr1, format='PNG')
imagedata = imstr1.getvalue()

а затем вы можете позже загрузить его обратно в объект PIL.Image в противоположном направлении с помощью:

newim = PIL.Image.open(StringIO.StringIO(imagedata))
person Martijn Pieters    schedule 26.03.2015
comment
Спасибо. Этот код работает. Однако я должен снова исправить этот вопрос. Я обнаружил, что imstr должен быть объектом string, а не объектом StringIO. Пожалуйста, посмотрите на мое редактирование выше для более подробной информации. - person BerndGit; 27.03.2015
comment
@BerndGit: обновлено, чтобы показать, как получить данные изображения в виде строки. - person Martijn Pieters; 27.03.2015
comment
Прохладный. Спасибо за большую помощь. - person BerndGit; 27.03.2015