Python PIL: как записать PNG изображение в строку


Я создал изображение с помощью пил. Как я могу сохранить его в строку в памяти? Элемент Image.save() метод требует файл.

Я хотел бы иметь несколько таких изображений, хранящихся в словаре.

6 81

6 ответов:

можно использовать BytesIO класс, чтобы получить оболочку вокруг строк, которые ведут себя как файл. Элемент BytesIO объект предоставляет тот же интерфейс, что и файл, но сохраняет содержимое только в памяти:

import io

with io.BytesIO() as output:
    image.save(output)
    contents = output.getvalue()

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

image.save(output, format="GIF")

в старых версиях Python 2 перед введением io модуль у вас будет использовал StringIO модуль.

для Python3 требуется использовать BytesIO:

from io import BytesIO
from PIL import Image, ImageDraw

image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")

byte_io = BytesIO()

image.save(byte_io, 'PNG')

читать дальше:http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image

решение sth не сработало для меня
потому что внутри ...

Imaging/PIL / Image.pyc line 1423 - > поднять KeyError (ext) # неизвестно расширение

он пытался определить формат из расширения в имени файла, который не существует в StringIO case

вы можете обойти обнаружение формата, установив формат самостоятельно в параметре

import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()

save () может принимать файлоподобный объект, а также путь, поэтому вы можете использовать буфер в памяти, такой как StringIO:

buf= StringIO.StringIO()
im.save(buf, format= 'JPEG')
jpeg= buf.getvalue()

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

вам не нужно делать ничего из этого, чтобы смирить образ в памяти. Просто держите image объект в вашем словаре.

Если вы собираетесь написать свой словарь в файл, можно посмотреть im.tostring() способ и Image.fromstring() функция

http://effbot.org/imagingbook/image.htm

im.tostring () = > string

возвращает строку, содержащую пикселей данных с использованием стандарта "сырой" шифратор.

изображения.fromstring(режим, размер, данные) => изображение

создает память изображения из пикселей данные в строке, используя стандарт "сырой" декодер.

"формат" (.jpeg, .png и др.) имеет значение только на диске когда вы обмениваетесь файлами. Если вы не обмениваетесь файлами, формат не имеет значения.

С современным (по состоянию на середину 2017 Python 3.5 и подушка 4.0):

StringIO больше не работает так, как раньше. Класс BytesIO-это правильный способ справиться с этим. Функция сохранения подушки ожидает строку в качестве первого аргумента и удивительно не видит StringIO как таковой. Следующее Похоже на более старые решения StringIO, но с BytesIO на его месте.

from io import BytesIO
from PIL import Image

image = Image.open("a_file.png")
faux_file = BytesIO()
image_data = faux_file.getvalue()
image.save(faux_file, 'png')