Forked from valberg/imagewiththumbnails_updateable.py
Created
February 13, 2021 02:36
-
-
Save hvitis/0cb88247ca7b1a12ee2d84a392379f88 to your computer and use it in GitHub Desktop.
Django create thumbnail form ImageField and save in a different ImageField - now with updating!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment