Я сгенерировал изображение, используя PIL. Как сохранить его в строке в памяти?
Для метода Image.save() требуется файл.
Я хотел бы иметь несколько таких изображений, хранящихся в словаре.
Я сгенерировал изображение, используя PIL. Как сохранить его в строке в памяти?
Для метода Image.save() требуется файл.
Я хотел бы иметь несколько таких изображений, хранящихся в словаре.
 Вы можете использовать класс  BytesIO чтобы  BytesIO строки, которые ведут себя как файл. Объект BytesIO предоставляет тот же интерфейс, что и файл, но сохраняет содержимое только в памяти:
import io
with io.BytesIO() as output:
    image.save(output, format="GIF")
    contents = output.getvalue()
  Вы должны явно указать выходной формат с параметром format, в противном случае PIL выдаст ошибку при попытке его автоматического обнаружения.
 Если вы загрузили изображение из файла, у него есть параметр  format который содержит исходный формат файла, поэтому в этом случае вы можете использовать format=image.format.
 В старых версиях 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 → raise KeyError (ext) # unknown расширение
Он пытался обнаружить формат из расширения в имени файла, который не существует в случае StringIO
Вы можете обойти обнаружение формата, установив формат самостоятельно в параметре
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()
		С современными (по состоянию на середину 2017 года Python 3.5 и Pillow 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.save(faux_file, 'png')
		Когда вы говорите: "Я хотел бы, чтобы количество таких изображений сохранялось в словаре", неясно, является ли это структурой в памяти или нет.
 Вам не нужно делать что-либо из этого, чтобы смирить изображение в памяти. Просто сохраните image объекта в своем словаре.
 Если вы собираетесь написать свой словарь в файл, вы можете захотеть взглянуть на im.tostring() метод и Image.fromstring() функция
http://effbot.org/imagingbook/image.htm
im.tostring() => строка
Возвращает строку, содержащую данные пикселей, используя стандартный "сырой" кодировщик.
Image.fromstring (режим, размер, данные) => изображение
Создает память изображений из данных пикселей в строке, используя стандартный "сырой" декодер.
"Формат" (.jpeg,.png и т.д.) Имеет значение только на диске, когда вы обмениваетесь файлами. Если вы не обмениваетесь файлами, формат не имеет значения.