Skip to content

Instantly share code, notes, and snippets.

@nguyendangminh
Created June 3, 2015 04:07
Show Gist options
  • Save nguyendangminh/cbfca81e278c367894af to your computer and use it in GitHub Desktop.
Save nguyendangminh/cbfca81e278c367894af to your computer and use it in GitHub Desktop.
Django thumbnail
# add the following util.py to your application directory
# in the models.py
from .util import create_thumbnail
class Article(models.Model):
image = models.ImageField(default="")
thumbnail = models.ImageField()
def save(self):
# create a thumbnail
size = (200,200)
create_thumbnail(self.image, self.thumbnail, size)
super(Article, self).save()
def create_thumbnail(original, thumb, size):
# original code for this method came from
# http://www.yilmazhuseyin.com/blog/dev/create-thumbnails-imagefield-django/
# If there is no image associated with this.
# do not create thumbnail
if not original:
return
from PIL import Image
from cStringIO import StringIO
from django.core.files.uploadedfile import SimpleUploadedFile
import os
# Set our max thumbnail size in a tuple (max width, max height)
THUMBNAIL_SIZE = size
DJANGO_TYPE = original.file.content_type
if DJANGO_TYPE == 'image/jpeg':
PIL_TYPE = 'jpeg'
FILE_EXTENSION = 'jpg'
elif DJANGO_TYPE == 'image/png':
PIL_TYPE = 'png'
FILE_EXTENSION = 'png'
# Open original photo which we want to thumbnail using PIL's Image
image = Image.open(StringIO(original.read()))
# Convert to RGB if necessary
# Thanks to Limodou on DjangoSnippets.org
# http://www.djangosnippets.org/snippets/20/
#
# I commented this part since it messes up my png files
#
#if image.mode not in ('L', 'RGB'):
# image = image.convert('RGB')
# We use our PIL Image object to create the thumbnail, which already
# has a thumbnail() convenience method that contrains proportions.
# Additionally, we use Image.ANTIALIAS to make the image look better.
# Without antialiasing the image pattern artifacts may result.
image.thumbnail(THUMBNAIL_SIZE, Image.ANTIALIAS)
# Save the thumbnail
temp_handle = StringIO()
image.save(temp_handle, PIL_TYPE)
temp_handle.seek(0)
# Save image to a SimpleUploadedFile which can be saved into
# ImageField
suf = SimpleUploadedFile(os.path.split(original.name)[-1],
temp_handle.read(), content_type=DJANGO_TYPE)
# Save SimpleUploadedFile into image field
thumb.save('%s_thumbnail.%s'%(os.path.splitext(suf.name)[0],FILE_EXTENSION), suf, save=False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment