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 и сохранить его соотношение сторон?), ширина и высота указаны для создания миниатюры. Есть ли какая-либо функция, которая принимает новую ширину или новую высоту (не обе) и масштабирует все изображение?
Ответы
Ответ 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)))