Source code for flask_fs.images

# -*- coding: utf-8 -*-
'''
This module handle image operations (thumbnailing, resizing...)
'''
from __future__ import unicode_literals, division

import logging
import six

from PIL import Image


log = logging.getLogger(__name__)


[docs]def make_thumbnail(file, size, bbox=None): ''' Generate a thumbnail for a given image file. :param file file: The source image file to thumbnail :param int size: The thumbnail size in pixels (Thumbnails are squares) :param tuple bbox: An optionnal Bounding box definition for the thumbnail ''' image = Image.open(file) if bbox: thumbnail = crop_thumbnail(image, size, bbox) else: thumbnail = center_thumbnail(image, size)
return _img_to_file(thumbnail) def center_thumbnail(image, size): result = Image.new('RGBA', (size, size), (255, 255, 255, 0)) if image.size[0] > image.size[1]: new_size = (size, int(image.size[1] * size / image.size[0])) else: new_size = (int(image.size[0] * size / image.size[1]), size) resized = image.resize(new_size, Image.ANTIALIAS) position = (int((size - new_size[0]) / 2), int((size - new_size[1]) / 2)) result.paste(resized, position) return result def crop_thumbnail(image, size, bbox): return image.crop(bbox).resize((size, size), Image.ANTIALIAS) def resize(file, size): image = Image.open(file) if image.size[0] > size or image.size[1] > size: ratio = min(size / image.size[0], size / image.size[1]) size = (image.size[0] * ratio, image.size[1] * ratio) image.thumbnail(size, Image.ANTIALIAS) return _img_to_file(image) def optimize(file): image = Image.open(file) return _img_to_file(image) def _img_to_file(image): out = six.BytesIO() if image.mode == 'CMYK': image = image.convert('RGBA') image.save(out, image.format or 'png', optimize=True) out.seek(0) return out