Pillow resizes pixel images - Django / Pillow

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

    #allowed image types are png, jpg, jpeg, gif
    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 = ImageOps.fit(im, final_size, Image.ANTIALIAS, centering = (0.5,0.5))
            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) . !

+4
1

(Python 2.7, Pillow 2.4.0), .

from PIL import Image

large_size = (1920, 1200)

im = Image.open("babu_980604.jpeg")

image_w, image_h = im.size
aspect_ratio = image_w / float(image_h)
new_height = int(large_size[0] / aspect_ratio)

if new_height < 1200:
    final_width = large_size[0]
    final_height = new_height
else:
    final_width = int(aspect_ratio * large_size[1])
    final_height = large_size[1]

imaged = im.resize((final_width, final_height), Image.ANTIALIAS)

imaged.show()
imaged.save("out.jpg", quality=90)

, image_w image_h get_image_dimensions(image), .

output image

:

  • infile with open(...) .

  • final_size im.resize().

  • base_width large_size[0], large_size[1] .

  • image requests.FILES['file'], requests.FILES['file'] . image.

  • global random, , .

+9

Source: https://habr.com/ru/post/1542387/


All Articles