Доброго здоровья читателям моего канала programmer's notes. Поддерживаем канал по программированию на Python.
Библиотека pillow, изменение размеров изображений
По графике я много чего не написал. Будем восполнять. Сегодня об изменении размеров изображения с соблюдением пропорций.
Первый подход работает на уменьшение размеров изображения и использует метод thumbnail(). Он хорош для создания миниатюр, т.е. не больших изображений.
Пример 1.
#!/usr/bin/python3
from PIL import Image
img = Image.open('./kotik.jpg', mode='r')
dx = img.size[0] / 4
dy = img.size[1] / 4
img.thumbnail((dx, dy))
newf1 = './kotik2.jpg'
img.save(newf1, 'jpeg')
img.close()
В примере мы уменьшаем размер изображения в четыре раза, при чём пропорционально, исходя из первоначальных размеров. Конечно, можно указать и конкретные размеры, скажем какой-то квадрат. Но тогда метод thumbnail() будет действовать по-другому. Он уменьшит размер картинки, так, чтобы эти размеры не превышали указанные. Т.е. метод просто за нас выполняет работу.
Другой метод, который можно использовать для изменения размеров картинки resize().
Пример 2.
#!/usr/bin/python3
from PIL import Image
img = Image.open('./kotik.jpg', mode='r')
dx = img.size[0] * 4
dy = img.size[1] * 4
img1 = img.resize((dx, dx))
newf1 = './kotik2.jpg'
img1.save(newf1, 'jpeg')
img.close()
img1.close()
Обращу внимание на то, что метод resize() не меняет исходный размер картинки, он создаёт новую. Как видите, мы увеличили размер картинки.
Наконец в библиотеке pillow есть ещё метод fit(). Он меняет размер изображения сохраняя пропорции, даже если размеры этим пропорциям не соответствуют, но обрезает края, чтобы изображение не было искажено. При этом используется другой модуль библиотеки pillow - ImageOps().
Пример 3.
#!/usr/bin/python3
from PIL import Image, ImageOps
img = Image.open('./kotik.jpg', mode='r')
dx = 400
dy = 400
img1 = ImageOps.fit(img, (dx, dx), method=Image.LANCZOS)
newf1 = './kotik2.jpg'
img1.save(newf1, 'jpeg')
img.close()
img1.close()
Это как раз тот случай, когда метод при необходимости обрежет края. Вместо Image.LANCZOS можно использовать Image.NEAREST, но это ухудшает качество.
Вообще метод fit() очень интересен и мы будем рассматривать его в других статьях.
Ну и всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.