Создание миниатюр в памяти в 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 2

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()