2014-07-14 2 views
18

Предположим, у меня есть изображение 2322px x 4128px. Как его масштабировать так, чтобы ширина и высота были меньше 1028 пикселей?Python/Pillow: Как масштабировать изображение

Я не смогу использовать Image.resize (https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.resize), так как это требует от меня предоставления как новой ширины, так и высоты. То, что я планирую сделать это (псевдо-код ниже):

if (image.width or image.height) > 1028: 
    if image.width > image.height: 
     tn_image = image.scale(make width of image 1028) 
     # since the height is less than the width and I am scaling the image 
     # and making the width less than 1028px, the height will surely be 
     # less than 1028px 
    else: #image's height is greater than it's width 
     tn_image = image.scale(make height of image 1028) 

Я предполагаю, что мне нужно использовать Image.thumbnail, но согласно этому примеру (http://pillow.readthedocs.org/en/latest/reference/Image.html#create-thumbnails) и этот ответ (How do I resize an image using PIL and maintain its aspect ratio?), как ширина и высота для создания миниатюры. Есть ли какая-либо функция, которая принимает либо новую ширину, либо новую высоту (не оба) и масштабирует все изображение?

+0

Где проблема с предоставлением ширины и высоты 'Image.thumbnail'? Вы хотите сделать именно это с помощью своего пользовательского кода. – famousgarkin

ответ

38

Ие должен изобрести колесо, есть Image.thumbnail метод, доступный для этого:

maxsize = (1028, 1028) 
tn_image = image.thumbnail(maxsize, PIL.Image.ANTIALIAS) 

Обеспечивает полученный размер не больше, чем заданные пределы, пока сохраняет пропорцию.

Задание PIL.Image.ANTIALIAS применяет высококачественный фильтр понижающей дискретизации для лучшего результата изменения размера, возможно, вы тоже этого захотите.

+2

О, я неправильно понял, что это за миниатюра. Я подумал, что изображение.thumbnail (1028, 1028) изменяет размер изображения до 1028 ширины и высоты 1028 ... Я не знал image.thumbnail (1028, 1028) масштабирует изображение так, чтобы ширина и высота были меньше 1028 – user2719875

+2

@ user2719875 Я бы настоятельно предложил добавить параметр 'Image.ANTIALIAS'. –

+1

@MarkRansom Хорошая точка, добавив, что. – famousgarkin

10

Используйте Image.resize, но рассчитайте как ширину, так и высоту.

if image.width > 1028 or image.height > 1028: 
    if image.height > image.width: 
     factor = 1028/image.height 
    else: 
     factor = 1028/image.width 
    tn_image = image.resize((image.height * factor, image.width * factor)) 
Смежные вопросы