Ресайз и обрезка картинок в GAE

Давно хотел сделать что-то с использование google app engine. Недавно жена попросила сделать ей небольшой сайт для размещения фотографий своих изделий. Не долго думая решил использовать GAE.

Так как в отличие от django, изменение размера и обрезку фотографий пришлось делать вручную, решил записать где-то на будущее.

Изменение размера:

class ImageThumbnailer(webapp.RequestHandler):

    def get(self, resource):
        resource = str(urllib.unquote(resource))
        blob_info = blobstore.BlobInfo.get(resource)
        if blob_info:
            img = images.Image(blob_info.open().read())
            width, height = img.width, img.height
            size = float(getattr(settings, 'THUMBNAIL_SIZE', 400))

            if min((width, height)) < size:
                if width > height:
                    height = height * (size / width)
                    width = size
                else:
                    width = width * (size / height)
                    height = size

            if width > height:
                width = width / (height / size)
                height = size
            else:
                height = height / (width / size)
                width = size
            img.resize(int(width), int(height))
            thumb = img.execute_transforms(quality=85)

            self.response.headers['Content-Type'] = 'image/png'
            self.response.out.write(thumb)
            return

        self.error(404)

Изменение размера и обрезка по центру:

class ImageThumbnailerCrop(webapp.RequestHandler):

    def get(self, resource):
        resource = str(urllib.unquote(resource))
        blob_info = blobstore.BlobInfo.get(resource)
        if blob_info:
            img = images.Image(blob_info.open().read())
            width, height = img.width, img.height
            size = float(getattr(settings, 'THUMBNAIL_CROP_SIZE', 150))

            if min((width, height)) < size:
                if width > height:
                    height = height * (size / width)
                    width = size
                else:
                    width = width * (size / height)
                    height = size

            box = None
            if width > height:
                width = width / (height / size)
                height = size
                border = ((width - height) / 2.0) / width
                box = (border, 0.0, 1.0 - border, 1.0)
            else:
                height = height / (width / size)
                width = size
                border = ((height - width) / 2.0) / height
                box = (0.0, border, 1.0, 1.0 - border)
            img.resize(int(width), int(height))
            img.crop(*box)
            thumb = img.execute_transforms(quality=85)

            self.response.headers['Content-Type'] = 'image/png'
            self.response.out.write(thumb)
            return

        self.error(404)

Вообщем алгоритм есть, а как использовать это уже дело каждого. Возможно было бы удобнее сделать шаблонные фильтры/теги.