- Author:
- nidomedia
- Posted:
- September 22, 2008
- Language:
- Python
- Version:
- 1.0
- Score:
- -1 (after 1 ratings)
I've gotten this code originally from Dan Fairs. I've edited it a bit to make it do what I wanted it to do. I've sent a mail and the original can be considered public domain code. The same is true for this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | from django import template
from PIL import Image
from <APPNAME> import settings
import os
"""Thumbnail filter based on code from
http://batiste.dosimple.ch/blog/2007-05-13-1/. First hacked on
http://www.stereoplex.com/two-voices/a-django-image-thumbnail-filter
hacked further by Nido Media"""
register = template.Library()
THUMBNAILS = 'thumbnails'
SCALE_WIDTH = 'w'
SCALE_HEIGHT = 'h'
def scale(max_x, pair):
"""scales pair. Say pair is (x, y). The returned pair will be
(max_x, ''y scaled by max_x / x'')"""
x, y = pair
new_y = max_x * y / x
return (int(max_x), int(new_y))
@register.filter
def thumbnail(image, arg):
""" Checks if a thumbnail image already exists. If not, one is
created. The thumbnail will reside in the thumbnail folder
relative to the original image path, and bears an indication of it's
new size. This filter will return the URL of the thumbnail image.
TODO: This filter may not be thread safe"""
if not image:
return ''
original_image_path = settings.MEDIA_ROOT + image.__str__()
original_image_url = image.url
size = arg
if image.width < image.height:
mode = SCALE_HEIGHT
else:
mode = SCALE_WIDTH
# defining the size
max_size = int(size.strip())
# defining the file name and the miniature file name
basename, format = original_image_path.rsplit('.', 1)
basename, name = basename.rsplit(os.path.sep, 1)
miniature = name + '_' + str(max_size) + '.' + format
thumbnail_path = os.path.join(basename, THUMBNAILS)
if not os.path.exists(thumbnail_path):
os.mkdir(thumbnail_path)
miniature_filename = os.path.join(thumbnail_path, miniature)
baseurl, crud = original_image_url.rsplit('/', 1)
miniature_url = '/'.join((baseurl, THUMBNAILS, miniature))
# if the image wasn't already resized, resize it
if (not os.path.exists(miniature_filename)
or os.path.getmtime(original_image_path) >
os.path.getmtime(miniature_filename) ):
image = Image.open(original_image_path)
image_x, image_y = image.size
if mode == SCALE_HEIGHT:
image_y, image_x = scale(max_size, (image_y, image_x))
else:
image_x, image_y = scale(max_size, (image_x, image_y))
image = image.resize((image_x, image_y), Image.ANTIALIAS)
image.save(miniature_filename, image.format)
return miniature_url
# vim: shiftwidth=4 tabstop=4 expandtab textwidth=72
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 11 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months, 3 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 6 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 7 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
Don't import your project's settings like that.
#
Please login first before commenting.