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

Python/Pillow: как масштабировать изображение

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

Я не смогу использовать 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 height is greater than it width
        tn_image = image.scale(make height of image 1028)

Я предполагаю, что мне нужно использовать Image.thumbnail, но в соответствии с этим примером (http://pillow.readthedocs.org/en/latest/reference/Image.html#create-thumbnails) и этим ответом (Как изменить размер изображения с помощью PIL и сохранить его соотношение сторон?), ширина и высота указаны для создания миниатюры. Есть ли какая-либо функция, которая принимает новую ширину или новую высоту (не обе) и масштабирует все изображение?

4b9b3361

Ответ 1

Не нужно изобретать велосипед, для этого есть метод Image.thumbnail :

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

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

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

Ответ 2

Используйте 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((int(image.width * factor), int(image.height * factor)))