Відповіді:
Ви можете використовувати 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
замість цього використовували модуль.
You can use a file object instead of a filename. In this case, you must always specify the format.
Отже, якщо перший аргумент є файловим об'єктом, вам потрібно передати другий аргумент, який є форматом (наприклад 'PNG'
).
from io import StringIO
image.save(output, format=image.format)
Для 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
рішення для мене не спрацювало,
тому що в ...
Imaging / PIL / Image.pyc рядок 1423 -> підняти KeyError (ext) # невідоме розширення
Він намагався виявити формат із розширення у назві файлу, якого немає у випадку 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 тощо) має значення на диску лише під час обміну файлами. Якщо ви не обмінюєтесь файлами, формат не має значення.