I am developing an image downloader in Django. After the image has been downloaded and saved to disk, I am trying to resize the saved image, while maintaining its aspect ratio. I use Pillow for image processing / resizing. The problem occurs when I try to resize an image, getting pixelation, even if the aspect ratio of the resized image is the same as the original image.
Original saved image:
https://www.dropbox.com/s/80yk6tnwt3xnoun/babu_980604.jpeg
Modified pixel image:
https://www.dropbox.com/s/bznodpk4t4xlyqp/babu_736302.large.jpeg
I tried to solve this problem and checked other related stackoverflow links,
as
How to resize an image using PIL and keep its aspect ratio?
Resize the image while maintaining proportions And make portrait and landscape images the same size?
but the problem still persists.
Versions:
Django = 1.6.4
Pillow = 2.4.0
Everything is configured inside virtualenv. Please, help!
PS: I am new to the world of Python / Django
Here is my code snippet:
import json
import os
import hashlib
from datetime import datetime
from operator import itemgetter
import random
from random import randint
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.http import (HttpResponse, HttpResponseRedirect)
from django.core.context_processors import csrf
from django.core.files.images import get_image_dimensions
from django.shortcuts import render, redirect
from django.forms.models import model_to_dict
from django.views.decorators.csrf import csrf_exempt
from PIL import Image, ImageOps
from django.views.decorators.csrf import csrf_exempt, csrf_protect
import settings
from hashlib import md5
from django import forms
from beardedavenger.models import *
from django.views.decorators.http import require_POST
import pdb
import requests
def imagehandler(requests):
if requests.method == 'POST':
filename = requests.FILES['file'].name
file_extension = filename.split('.')[len(filename.split('.')) - 1].lower()
errors = []
username = 'nit'
global random
if file_extension not in settings.IMAGE_FILE_TYPES:
errors.append('The image file you provided is not valid. Only the following extensions are allowed: %s' % ', '.join(settings.IMAGE_FILE_TYPES))
else:
image = requests.FILES['file']
image_w, image_h = get_image_dimensions(image)
rand = str(random.randint(100000,999999))
with open(settings.MEDIA_ROOT + username + '_' + rand + '.jpeg', 'wb+') as destination:
for chunk in requests.FILES['file'].chunks():
destination.write(chunk)
large_size = (1920, 1200)
infile = settings.MEDIA_ROOT + username + '_' + rand + ".jpeg"
large_file = settings.MEDIA_ROOT + username + '_' + rand +".large"
try:
im = Image.open(infile)
base_width = large_size[0]
aspect_ratio = float(image_w / float(image_h))
new_height = int(base_width / aspect_ratio)
if new_height < 1200:
final_width = base_width
final_height = new_height
else:
final_width = int(aspect_ratio * large_size[1])
final_height = large_size[1]
final_size = (final_width, final_height)
imaged = im.resize((final_width, final_height), Image.ANTIALIAS)
imaged.save(large_file, "JPEG", quality=90)
except IOError:
errors.append('error while resizing image')
if not errors:
response = HttpResponse(json.dumps({'status': 'success','filename': filename }),
mimetype="application/json")
else:
response = HttpResponse(json.dumps({'status': 'failure','errors': errors,'message': 'Error uploading Picture. '}),
mimetype="application/json")
return response
else:
return render(requests, 'upload.html')
Update:
Pillow . , , [ , ). ImageMagick ( , !) Wand API (docs.wand-py.org/en/0.3.7/index.html) . !