SP/web2py/gluon/contrib/imageutils.py

74 lines
2.3 KiB
Python
Raw Permalink Normal View History

2018-10-25 15:33:07 +00:00
# -*- coding: utf-8 -*-
#######################################################################
#
# Put this file in yourapp/modules/images.py
#
# Given the model
#
# db.define_table("table_name", Field("picture", "upload"),
# Field("thumbnail", "upload"))
#
# to resize the picture on upload
#
# from images import RESIZE
#
# db.table_name.picture.requires = RESIZE(200, 200)
#
# to store original image in picture and create a thumbnail
# in 'thumbnail' field
#
# from images import THUMB
# db.table_name.thumbnail.compute = lambda row: THUMB(row.picture, 200, 200)
#########################################################################
from gluon import current
class RESIZE(object):
def __init__(self, nx=160, ny=80, quality=100, padding = False,
error_message=' image resize'):
(self.nx, self.ny, self.quality, self.error_message, self.padding) = (
nx, ny, quality, error_message, padding)
def __call__(self, value):
if isinstance(value, str) and len(value) == 0:
return (value, None)
from PIL import Image
from io import BytesIO
try:
img = Image.open(value.file)
img.thumbnail((self.nx, self.ny), Image.ANTIALIAS)
s = BytesIO()
if self.padding:
background = Image.new('RGBA', (self.nx, self.ny), (255, 255, 255, 0))
background.paste(
img,
((self.nx - img.size[0]) // 2, (self.ny - img.size[1]) // 2))
background.save(s, 'JPEG', quality=self.quality)
else:
img.save(s, 'JPEG', quality=self.quality)
s.seek(0)
value.file = s
except:
return (value, self.error_message)
else:
return (value, None)
def THUMB(image, nx=120, ny=120, gae=False, name='thumb'):
if image:
if not gae:
request = current.request
from PIL import Image
import os
img = Image.open(os.path.join(request.folder, 'uploads', image))
img.thumbnail((nx, ny), Image.ANTIALIAS)
root, ext = os.path.splitext(image)
thumb = '%s_%s%s' % (root, name, ext)
img.save(request.folder + 'uploads/' + thumb)
return thumb
else:
return image