Skip to content

Instantly share code, notes, and snippets.

Created April 20, 2012 14:55
  • Star 30 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save valberg/2429288 to your computer and use it in GitHub Desktop.
Django create thumbnail form ImageField and save in a different ImageField - now with updating!
# Extension of
# Note: image_folder and thumbnail_folder are both a callable (ie. a lambda that does a '/'.join())
class Image(Media):
image = models.ImageField(
thumbnail = models.ImageField(
def create_thumbnail(self):
# original code for this method came from
# If there is no image associated with this.
# do not create thumbnail
if not self.image:
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)
DJANGO_TYPE = self.image.file.content_type
if DJANGO_TYPE == 'image/jpeg':
PIL_TYPE = 'jpeg'
elif DJANGO_TYPE == 'image/png':
PIL_TYPE = 'png'
# Open original photo which we want to thumbnail using PIL's Image
image =
# 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(), PIL_TYPE)
# Save image to a SimpleUploadedFile which can be saved into
# ImageField
suf = SimpleUploadedFile(os.path.split([-1],, content_type=DJANGO_TYPE)
# Save SimpleUploadedFile into image field
'%s_thumbnail.%s' % (os.path.splitext([0], FILE_EXTENSION),
def save(self, *args, **kwargs):
force_update = False
# If the instance already has been saved, it has an id and we set
# force_update to True
force_update = True
# Force an UPDATE SQL query if we're editing the image to avoid integrity exception
super(Image, self).save(force_update=force_update)
Copy link

Reached this snippet from google, what if I upload a .gif image here ? :B

Copy link

ffeast commented Jun 5, 2014

Here is a ready-to-use django library that works the way your snippet does:

Not sure about updates though

Copy link

dimkoug commented May 19, 2017

For python 3 support replace StringIO with BytesIO

from io import BytesIO

Copy link

neeraj9194 commented Sep 3, 2018 in line 44, sets the pointer to the last byte and causes a problem with Google storage multipart upload, so you can set seek(0).
google storage error: ValueError: Size 266518 was specified but the file-like object only had 0 bytes remaining.

add this at line 45

If anyone has a better solution really like to hear...

Copy link

vQuadX commented Jul 27, 2019

You can use this method for creating thumbnail image:

from PIL import Image
from django.db.models.fields.files import ImageFieldFile
from django.core.files.uploadedfile import InMemoryUploadedFile

def _create_thumbnail(image_field: ImageFieldFile, thumbnail_image_field: ImageFieldFile, size: tuple):
    image =
    image_file = BytesIO(), image.format),
            None, '',

Copy link

Django extracts the content-type from the extension of the given filename, not the content_type parameter of SimpleUploadedFile. So, you might as well use the normal ContentFile.

I ended up using the following:

  def resize(self, geom):
    from PIL import Image

    img =

    def image_to_byte_array(img):
      byte_arr = io.BytesIO(), format=img.format)
      byte_arr = byte_arr.getvalue()
      return byte_arr
    img_byte = image_to_byte_array(img)
    img_file = ContentFile(img_byte)

    new_res = Resource()
    old_filename = os.path.split([-1],img_file,save=False)

    return new_res

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment