I had trouble with the above code. Perhaps it was because i am using the
uploadseparate =true parameter which means images get dropped into
different folders. Or perhaps because i don't know what i am doing.
Anyhow, the code below works for me. I had to manipulate the thumbnail
filename a lot to get it to work. There must be a better way than this
though...
# -*- coding: utf-8 -*-
import os
from random import seed
from random import random
try:
from PIL import Image
except:
import Image
db.define_table(
'Media',
Field('Description'),
Field('FileReference', 'upload', uploadseparate=True,
requires=IS_NOT_EMPTY() and IS_IMAGE(extensions=('jpeg',
'png','jpg','tif'))),
Field('ThumbnailLocation', type='upload', compute=lambda row:
SMARTHUMB(row.FileReference, (100,100))),
format = '%(Description)s')
def SMARTHUMB(FileReference, box, fit=True, name="thumb"):
'''Downsample the image.
@param img: Image - an Image-object
@param box: tuple(x, y) - the bounding box of the result image
@param fit: boolean - crop the image to fill the box
'''
img_location = GetFullFilename('', FileReference)
img = Image.open(img_location)
#preresize image with factor 2, 4, 8 and fast algorithm
factor = 1
while img.size[0] / factor > 2 * box[0] and img.size[1] * 2 / factor >
2 * box[1]:
factor *= 2
if factor > 1:
img.thumbnail((img.size[0] / factor, img.size[1] / factor),
Image.NEAREST)
#calculate the cropping box and get the cropped part
if fit:
x1 = y1 = 0
x2, y2 = img.size
wRatio = 1.0 * x2 / box[0]
hRatio = 1.0 * y2 / box[1]
if hRatio > wRatio:
y1 = int(y2 / 2 - box[1] * wRatio / 2)
y2 = int(y2 / 2 + box[1] * wRatio / 2)
else:
x1 = int(x2 / 2 - box[0] * hRatio / 2)
x2 = int(x2 / 2 + box[0] * hRatio / 2)
img = img.crop((x1, y1, x2, y2))
#Resize the image with best quality algorithm ANTI-ALIAS
img.thumbnail(box, Image.ANTIALIAS)
#Assume five parts to the filename split on "." eg
Media.FileReference.a677042dfcd329d8.6361742e6a7067.jpg
#The 4th part seems to effect the filename and extension
fn_parts = FileReference.split(".")
seed(1)
thumb_filename = fn_parts[0] + '.' + fn_parts[1] + '.' +
fn_parts[2][0:2] + str(random())[2:16] + '.' + fn_parts[3] + '.' +
fn_parts[4]
img_location = GetFullFilename('', thumb_filename)
img.save(img_location)
return thumb_filename
def GetFullFilename(NamePrefix, FileReference):
folder = FileReference[20:22] # The first two characters of the 3rd
part of the name
FileLocation = request.folder + '\\uploads\\Media.FileReference\\' +
folder + '\\' + NamePrefix + FileReference
return FileLocation
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/web2py/a95964bd-555f-4f43-bba1-0df635336d0c%40googlegroups.com.