Ресайз и обрезка картинок в 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)
Вообщем алгоритм есть, а как использовать это уже дело каждого. Возможно было бы удобнее сделать шаблонные фильтры/теги.