Подтвердить что ты не робот

PIL Image.resize() не изменяет размер изображения

У меня есть странная проблема с PIL, не изменяя размер изображения.

def handle_uploaded_image(i, u):
    # resize image  
    from PIL import Image
    img = Image.open(i)
    if img.mode not in ('L', 'RGB'):
        img = img.convert('RGB')

    width, height = img.size
    if width == height:
        img.thumbnail(settings.THUMB_SIZE, Image.ANTIALIAS)
    elif width > height:
        ratio = floor(width / height)
        newwidth = ratio * 150
        newwidthhalf = floor(newwidth / 2)
        img.resize((newwidth, 150), Image.ANTIALIAS)
        box = 1
        img.crop((newwidthhalf, 0, 150, 150))
    elif height > width:
        ratio = floor(height / width)
        newheight = ratio * 150
        newheighthalf = floor(newheight / 2)
        img.resize((150, newheight), image.ANTIALIAS)
        box = 1 
        img.crop((0, newheighthalf, 150, 150))
    path = '/'.join([settings.MEDIA_ROOT, 'users', u.username, 'mugshotv2.jpg'])
    img.save(path, format='JPEG')

Этот код работает без ошибок и дает мне изображение с именем mugshotv2.jpg в правильной папке, но оно не изменяет его размер. Он что-то делает, потому что размер изображения падает от 120 кб до 20 кб, но размеры остаются неизменными.

Возможно, вы также можете предложить способ обрезать изображения на квадраты с меньшим количеством кода. Я подумал, что Image.thumbnail делает это, но то, что он сделал, это то, что он масштабировал мое изображение до 150 пикселей по ширине, оставив высоту 100 пикселей.

Алан.

4b9b3361

Ответ 1

resize() возвращает измененную копию изображения. Он не изменяет оригинал. Правильный способ использования:

img = img.resize((150, newheight), image.ANTIALIAS)

источник

Я думаю, что вы ищете функцию ImageOps.fit. Из PIL docs:

ImageOps.fit(изображение, размер, метод, удаление, центровка) = > изображение

Возвращает размерную и обрезанную версию изображение, обрезанное по запрошенному пропорции и размер. Размер аргументом является запрашиваемый размер вывода в пикселях, заданных как (ширина, высота) кортеж.