Растровая графика с Pillow

Библиотека Pillow – это мощный инструмент для работы с изображениями в языке программирования Python. Она представляет собой обертку над библиотекой PIL (Python Imaging Library), добавляя множество новых возможностей и улучшений. Pillow позволяет разработчикам легко открывать, изменять, сохранять и обрабатывать изображения в самых различных форматах.

С помощью Pillow можно выполнять такие операции, как изменение размера изображений, обрезка, поворот, наложение текстов и фильтров, а также преобразование цветовых пространств. Библиотека поддерживает форматы PNG, JPEG, BMP, GIF и многие другие, что делает её универсальным решением для работы с коллегами и миром графики.

Кроме того, Pillow предлагает обширный набор функций для создания новых изображений, рисования графики, добавления текстур и создания коллажей. Легкость в использовании и богатый функционал делают библиотеку неотъемлемой частью арт- и графических проектов.

Пластику работы с изображениями можно использовать как в веб-разработке, так и в научных приложениях, что делает Pillow идеальным выбором для любых задач, связанных с обработкой изображений.

 

Основные методы Pillow

Модуль Pillow в Python предоставляет мощные инструменты для обработки изображений, расширяя возможности базового модуля PIL. Основные методы, которые стоит выделить, включают:

  1. open() - позволяет открывать изображение с диска. С помощью этого метода загружается изображение и создается объект Image.

  2. show() - предназначен для отображения изображения в стандартной программе просмотра.

  3. save() - используется для сохранения изображения в файл с возможностью выбора формата (JPEG, PNG и др.).

  4. resize() - изменяет размеры изображения, что бывает полезно при подготовке к веб-размещению или печати.

  5. rotate() - поворачивает изображение на заданный угол, позволяя легко корректировать его ориентацию.

  6. crop() - вырезает определённую область изображения, что актуально для фокусировки на конкретных деталях.

  7. filter() - применяет фильтры для улучшения качества изображения, например, размытие или повышение резкости.

Эти методы делают Pillow универсальным инструментом для работы с изображениями, позволяя разработчикам легко интегрировать функции обработки изображений в свои приложения.

 

Подготовка проекта

Создадим новый проект и начнем с установки pillow:

В терминале виртуальной среды выполните команду:

pip install pillow

Давайте импортируем соответствующие модули, которые мы будем использовать.

import os
from PIL import Image, ImageEnhance, ImageDraw, ImageFont, ImageFilter

Для следующих упражнений мы будем использовать фотографию ниже (хотя вы можете использовать свою собственную). Скачайте его и сохраните под названием lokomotiv.jpg в месте, рядом с файлом Python этого проекта.

В результате у вас должен получиться следующий вид проекта:


Давайте напишем функцию, которая будет отображать файл, а также печатать информацию о файле. Мы будем продолжать использовать ее и далее для просмотра результатов действий на фотографии.

def get_img(file):
    # Открытие файла
    foto = Image.open(os.path.join(file))
    # Просмотр изображения
    foto.show()
    # Вывод данных о файле
    print(f'Файл: {file},\
    Формат: {foto.format},\
    Размер: {foto.size},\
    Режим: {foto.mode}')

И ниже добавим вызов нашей функции, передав имя нашего файла. В случае, если вы хотите открыть файл из другой папки, то необходимо указать полный путь к файлу.

get_img('lokomotiv.jpg')

Запустим данный код, в результате у нас будет открыто наше изображение и в консоли Python мы увидим вывод:

Файл: lokomotiv.jpg,    Формат: JPEG,    Размер: (700, 525),    Режим: RGB

 

Основные возможности Pillow в Python

Изменение формата изображения в Python

С помощью модуля Pillow мы можем изменять формат изображения, это реализуется с помощью метода save(). Изменим следующий код открытия изображения:

get_img('lokomotiv.jpg')

На следующий:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# Конвертируем в формат PNG
foto.save(os.path.join('lokomotiv.png'))
# вызываем нашу функцию, открытия и просмотра информации об изображении
get_img('lokomotiv.png')

Попробуем запустить код, мы увидим что у нас был создан и открыт новый файл формата PNG:

И получим следующий вывод в консоль:

Файл: lokomotiv.png,    Формат: PNG,    Размер: (700, 525),    Режим: RGB

 

Изменение размера изображения в Python

Используя данный модуль, мы можем управлять размерами изображений. Добавим следующий код:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# создаем копию нашего изображения
new_foto = foto.copy()
# устанавливаем размеры копии
new_foto.thumbnail((400, 400))
# сохраняем копию изображения
new_foto.save(os.path.join('new_lokomotiv.jpg'),'JPEG')
# вызываем нашу функцию, открытия и просмотра информации об скопированном изображении
get_img('new_lokomotiv.jpg')

В результате получим следующий вывод в консоль:

Файл: new_lokomotiv.jpg,    Формат: JPEG,    Размер: (400, 300),    Режим: RGB

Как мы видим, размеры изображения были изменены, но с сохранением пропорций.

 

Поворот изображения в Python

Одна из важных особенностей модуля Pillow в Python, это работа с поворотом и наклоном изображений.

foto = Image.open(os.path.join('lokomotiv.jpg'))
# поворачиваем наше изображение на 90 градусов
foto_90 = foto.transpose(Image.ROTATE_90)
# и сохраняем его
foto_90.save(os.path.join('lokomotiv_90.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_90.jpg')

В результате мы получим следующее изображение:

И следующий вывод в консоль:

Файл: lokomotiv_90.jpg,    Формат: JPEG,    Размер: (525, 700),    Режим: RGB

Также мы можем использовать другие варианты поворота изображения используя следующие переменные Image.ROTATE_180,  Image.ROTATE_270.

А в случае поворота на любой другой угол мы должны использовать метод rotate(), в результате мы получим следующее изображение:

Также мы можем легко отобразить наше изображение по горизонтали и вертикали:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# отражаем наше изображение по горизонтали
foto_lr = foto.transpose(Image.FLIP_LEFT_RIGHT)
# и сохраняем его
foto_lr.save(os.path.join('lokomotiv_lr.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_lr.jpg')

И в результате получим следующее изображение:

 

Для отображение по вертикали, нам необходимо использовать Image.FLIP_TOP_BOTTOM

 

Работа с контрастностью изображений через Pillow в Python

Также в модуле Pillow предусмотрена работа с контрастностью изображений:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# изменим контраст нашего изображения
foto_contrast = ImageEnhance.Contrast(foto).enhance(1.7)
# и сохраняем его
foto_contrast.save(os.path.join('lokomotiv_contrast.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_contrast.jpg')

В результате получим следующее изображение:

Также мы можем установить значение enhance(0.2), чтобы уменьшить контраст изображения:

 

Давайте теперь преобразуем изображение в оттенки серого:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# преобразуем изображение в оттенки серого
foto_silver = foto.convert('L')
# и сохраняем его
foto_silver.save(os.path.join('lokomotiv_silver.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_silver.jpg')

В результате получим следующее изображение:

 

Также мы можем объединить преобразование в оттенки серого с увеличением контраста:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# изменим контраст нашего изображения
foto_silver = foto.convert('L')
foto_silver = ImageEnhance.Contrast(foto_silver).enhance(1.7)
# и сохраняем его
foto_silver.save(os.path.join('lokomotiv_silver.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_silver.jpg')

И получим следующий результат:

Теперь осветлим, а затем затемним изображение:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# осветлим наше изображение
foto_light = ImageEnhance.Brightness(foto).enhance(1.7)
# и сохраняем его
foto_light.save(os.path.join('lokomotiv_light.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_light.jpg')

А теперь затемним его:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# затемним наше изображение
foto_dark = ImageEnhance.Brightness(foto).enhance(0.5)
# и сохраняем его
foto_dark.save(os.path.join('lokomotiv_dark.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_dark.jpg')

Мы также можем сделать изображение более четким и размытым:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# затемним наше изображение
foto_blur = ImageEnhance.Sharpness(foto).enhance(0.01)
# и сохраняем его
foto_blur.save(os.path.join('lokomotiv_blur.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_blur.jpg')

Эффект размытия не очень хорошо виден на сгенерированной фотографии, лучший эффект можно получить, используя соответствующий фильтр:

foto = Image.open(os.path.join('lokomotiv.jpg'))
# затемним наше изображение
foto_blur = foto.filter(ImageFilter.GaussianBlur(5))
# и сохраняем его
foto_blur.save(os.path.join('lokomotiv_blur.jpg'),'JPEG')
# вызываем нашу функцию открытия и просмотра информации об изображении
get_img('lokomotiv_blur.jpg')

 

Выводы

Данный обзор модуля Pillow в Python позволяет заключить, что Pillow является мощным и универсальным инструментом для работы с изображениями. Его простота в использовании и широкий функционал делают его идеальным выбором как для начинающих, так и для опытных разработчиков. Модуль поддерживает множество форматов изображений, предоставляет возможности для их редактирования, включая изменение размера, обрезку и фильтрацию, а также позволяет добавлять текст и графические элементы.

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

Итак, благодаря своей гибкости, простоте и расширяемости, Pillow остаётся одним из лучших инструментов для обработки изображений в экосистеме Python, что делает его незаменимым для разработчиков, работающих в области графики, веб-дизайна и машинного обучения.

Добавлено: 11 октября 2024 г. 4:57, всего 64 просмотра.