Возможно, вам нужно изменить размер фотографии, используя для этого Python. Лично мне это необходимо для размещения изображений для рассылки по почте или для поста на сайте, но изображения слишком большие. Как правило, для этих целей используют редакторы. Я также пользуюсь ими, но ради интереса я покажу, как это делается при помощи языка программирования Python. Самый быстрый способ сделать это – использовать пакет Pillow, который можно установить при помощи pip.
1 |
pip install Pillow |
После этого, открываем свой любимый редактор кода и пробуем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from PIL import Image def resize_image(input_image_path, output_image_path, size): original_image = Image.open(input_image_path) width, height = original_image.size print('The original image size is {wide} wide x {height} ' 'high'.format(wide=width, height=height)) resized_image = original_image.resize(size) width, height = resized_image.size print('The resized image size is {wide} wide x {height} ' 'high'.format(wide=width, height=height)) resized_image.show() resized_image.save(output_image_path) if __name__ == '__main__': resize_image(input_image_path='caterpillar.jpg', output_image_path='caterpillar_small.jpg', size=(800, 400)) |
Здесь мы импортируем класс Image из пакета Pillow. Далее, мы видим функцию, которая принимает три аргумента:
- Локация файла, который мы хотим открыть;
- Локацию, куда мы хотим сохранить измененное изображение;
- Кортеж, который демонстрирует новый размер изображения, где кортеж – это ширина и высота.
Далее, мы открываем изображение и вводим его размер. После этого, мы вызываем метод resize() объекта изображения с размером переданного кортежа. Наконец, мы берем новый размер, выводим его и открываем изображение перед тем, как сохранить изменения. Теперь оно выглядит вот так:
Как мы видим, метод resize() ничего не делает с масштабированием. Давайте разберемся с этой задачей!
Масштабирование изображения
Скорее всего, изменять размер изображения таким образом, как мы видели выше, вам не хочется, для лучшего результата нужно написать метод масштабирования. Проблема с предыдущим методом в том, что он не учитывает соотношения сторон картинки. Так что вместо изменения размера, вы можете просто использовать метод thumbnail(). Давайте попробуем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from PIL import Image def scale_image(input_image_path, output_image_path, width=None, height=None ): original_image = Image.open(input_image_path) w, h = original_image.size print('The original image size is {wide} wide x {height} ' 'high'.format(wide=w, height=h)) if width and height: max_size = (width, height) elif width: max_size = (width, h) elif height: max_size = (w, height) else: # No width or height specified raise RuntimeError('Width or height required!') original_image.thumbnail(max_size, Image.ANTIALIAS) original_image.save(output_image_path) scaled_image = Image.open(output_image_path) width, height = scaled_image.size print('The scaled image size is {wide} wide x {height} ' 'high'.format(wide=width, height=height)) if __name__ == '__main__': scale_image(input_image_path='caterpillar.jpg', output_image_path='caterpillar_scaled.jpg', width=800) |
Здесь мы даем Python передавать пути ввода и вывода, наряду с максимальной шириной и высотой. Далее, мы используем условное выражение для определения того, каким должен быть максимальный размер, после чего вызываем метод thumbnail() в нашем открытом объекте изображения. Мы также передаем флаг Image.ANTIALIAS, который применит фильтр для получения высокого качества изображения. Наконец, мы открываем обновленное, масштабированное изображение и выводим его новый размер, чтобы сравнить со старым. Если вы откроете масштабированное изображение, то увидите, что соотношение сторон фотографии сохранено.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Подведем итоги
Работа с пакетом Pillow – это просто и интересно. В данной статье мы научились менять размер изображений, масштабировать фотографии с учетом соотношения сторон. Вы также можете использовать новые знания для создания функции, которая будет выполнять вычисления над той или иной папкой и создавать эскизы хранящихся в ней фотографиях. Кроме этого, вы можете создать простое приложение для просмотра изображений и при этом удобное в использовании.
Для владельцев магазинов на WordPress есть отличная тема ThemeForest WoodMart для более выгодной конверсии покупателей. Отличный шаблон под планшеты и смартфоны.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»