74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
|
# -*- 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
|