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 пикселей.
Алан.
Ответы
Ответ 1
resize()
возвращает измененную копию изображения. Он не изменяет оригинал. Правильный способ использования:
img = img.resize((150, newheight), image.ANTIALIAS)
источник
Я думаю, что вы ищете функцию ImageOps.fit. Из PIL docs:
ImageOps.fit(изображение, размер, метод, удаление, центровка) = > изображение
Возвращает размерную и обрезанную версию изображение, обрезанное по запрошенному пропорции и размер. Размер аргументом является запрашиваемый размер вывода в пикселях, заданных как (ширина, высота) кортеж.