Created
October 25, 2017 03:24
-
-
Save leopard627/dad647ae138c7ce1fb0b4a19cfcd05fa to your computer and use it in GitHub Desktop.
Get Thumbnail!!!!!!!!!!!!
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