Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save phoikoi/e5b8c02daa78327a24847e36c94e2270 to your computer and use it in GitHub Desktop.

Select an option

Save phoikoi/e5b8c02daa78327a24847e36c94e2270 to your computer and use it in GitHub Desktop.

Revisions

  1. @valberg valberg created this gist Apr 20, 2012.
    80 changes: 80 additions & 0 deletions imagewiththumbnails_updateable.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,80 @@
    # Extension of http://www.yilmazhuseyin.com/blog/dev/create-thumbnails-imagefield-django/

    # Note: image_folder and thumbnail_folder are both a callable (ie. a lambda that does a '/'.join())

    class Image(Media):
    image = models.ImageField(
    upload_to=image_folder
    )

    thumbnail = models.ImageField(
    upload_to=thumbnail_folder,
    max_length=500,
    null=True,
    blank=True
    )

    def create_thumbnail(self):
    # original code for this method came from
    # http://snipt.net/danfreak/generate-thumbnails-in-django-with-pil/

    # If there is no image associated with this.
    # do not create thumbnail
    if not self.image:
    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 = (99, 66)

    DJANGO_TYPE = self.image.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(self.image.read()))

    # 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(self.image.name)[-1],
    temp_handle.read(), content_type=DJANGO_TYPE)
    # Save SimpleUploadedFile into image field
    self.thumbnail.save(
    '%s_thumbnail.%s' % (os.path.splitext(suf.name)[0], FILE_EXTENSION),
    suf,
    save=False
    )

    def save(self, *args, **kwargs):

    self.create_thumbnail()

    force_update = False

    # If the instance already has been saved, it has an id and we set
    # force_update to True
    if self.id:
    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)