Создание миниатюр в памяти в python
Я храню загруженные изображения в gridfs (mongodb). Поэтому данные изображения никогда не сохраняются в обычной файловой системе. Это работает с помощью следующего кода:
import pymongo
import gridfs
conn = pymongo.Connection()
db = conn.my_gridfs_db
fs = gridfs.GridFS(db)
...
with fs.new_file(
filename = 'my-filename-1.png',
) as fp:
fp.write(image_data_as_string)
Я также хочу сохранить миниатюры этого изображения. Мне все равно, какую библиотеку использовать, PIL, Pillow, sorl-thumbnail или то, что подходит лучше всего, будет работать для меня.
Я хочу знать, есть ли способ генерировать миниатюры без временного сохранения файла в файловой системе. Это было бы намного чище и меньше накладных расходов. Есть ли генератор миниатюр в памяти?
Обновление
Мое решение для сохранения миниатюры:
from PIL import Image, ImageOps
content = cStringIO.StringIO()
content(icon)
image = Image.open(content)
temp_content = cStringIO.StringIO()
thumb = ImageOps.fit(image, (width, height), Image.ANTIALIAS)
thumb.save(temp_content, format='png')
temp_content.seek(0)
gridfs_image_data = temp_content.getvalue()
with fs.new_file(
content_type = mimetypes.guess_type(filename)[0],
filename = filename,
size = size,
width = width,
height = height,
) as fp:
fp.write(gridfs_image_data)
Файл затем подается черезnginx-gridfs .
1 ответ:
Вы можете сохранить его в
StringIO
объект вместо файла (по возможности используйте модульcStringIO
):from StringIO import StringIO fake_file = StringIO() thing.save(fake_file) # Acts like a file handle contents = fake_file.getvalue() fake_file.close()
Или, если вам нравятся контекстные менеджеры:
import contextlib from StringIO import StringIO with contextlib.closing(StringIO()) as handle: thing.save(handle) contents = handle.getvalue()