Как сделать прозрачный фон pillow

Добавил пользователь Alex
Обновлено: 10.09.2024

PIL, известная как библиотека Python Imaging Library, может быть использована для работы с изображениями достаточно легким способом. У PIL не было никаких изменений и развития с 2009. Поэтому, добрые пользователи этого сайта предложили взглянуть на Pillow еще раз. Эта статья поможет вам узнать как пользоваться Pillow.

Что такое Pillow?

Pillow это форк PIL (Python Image Library), которая появилась благодаря поддержке Алекса Кларка и других участников. Основана на коде PIL, а затем преобразилась в улучшенную, современную версию. Предоставляет поддержку при открытии, управлении и сохранении многих форматов изображения. Многое работает так же, как и в оригинальной PIL.

Загрузка и установка Pillow

Перед началом использования Pillow, нужно загрузить и установить ее. Pillow доступна для Windows, Mac OS X и Linux. Самая “свежая” версия — это версия “8.1.0”, она поддерживается на python 3.6 и выше. Для установки Pillow на компьютеры Windows используйте conda или pip :

Для установки Pillow на компьютерах Linux просто используйте:

А установки Pillow на MacOS X нужно для начала установить XCode, а затем Homebrew. После того как Homebrew установлен, используйте:

Убедитесь, что Pillow установлена

Убедитесь, что Pillow установлена, откройте терминал и наберите следующее в текущей строке:

Если система показывает снова >>> , значит модули Pillow правильно установлены.

Форматы файлов

Перед началом использования модуля Pillow, давайте укажем некоторые поддерживаемые типы файлов: BMP, EPS, GIF, IM, JPEG, MSP, PCX PNG, PPM, TIFF, WebP, ICO, PSD, PDF . Некоторые типы файлов возможны только для чтения, в то время как другие доступны только для написания. Чтобы увидеть полный список поддерживаемых типов файла и больше информации о них, ознакомьтесь с руководством к Pillow.

Как использовать Pillow для работы с изображениями

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

Использование Pillow

Давайте посмотрим на возможные варианты использования этой библиотеки. Основные функции находятся в модуле Image . Вы можете создавать экземпляры этого класса несколькими способами. Путем загрузки изображений из файлов, обработки других изображений, либо создания изображений с нуля. Импортируйте модули Pillow, которые вы хотите использовать.

Oct 20, 2016 16:07 · 1076 words · 6 minute read python tutorial

Рано или поздно, но всем нам приходится работать с графикой. Заказчики просят добавить ватермарки, сделать превьюшки картинок, построить графики… В мире python для этого есть библиотека Pillow, которая действительно умеет если не всё, то очень многое.

Установка pillow

Pillow далеко не самостоятельная библиотека, ей необходима поддержка форматов сжатия файлов. Для ubuntu как правило хватает установки следующих пакетов:

То есть работы с jpg, png, ttf (шрифты) и gzip (нужен для некоторых форматов). Самое главное тут разделять сам объект Image (холст), который представляет собой абстрактную картинку, от его представления на диске в виде файла. Попробуем поиграться:

Пример

Ничего сложного - рисование примитивов и текста. Такое в жизни вряд ли пригодится, так что этот пример исключительно для ознакомления с базовыми возможностями.

Создание превью изображения

Существует куча разных библиотек для создания и хранения превьюшек картинок. В своих проектах на Django я использую sorl-thumbnail. В принципе она всем устраивает, большой плюс что она хранит ссылки на все сгенерированные изображения. Таким образом при смене основного изображения превьюшки пересоздаются заново. До недавнего времени там был критичный баг, но после небольших уговоров автор его закрыл.

Но не всегда разумно тянуть в проект такую махину. Порой хочется чего-нибудь лёгкого и простого. Например, как-то так:

Что может быть проще! :) У Image ещё есть метод resize , но, в отличие от thumbnail , он не сохраняет соотношение сторон (aspect ratio). Т.е. в примере выше картинка будет ужата до 64 пикселей по большей стороне.

Наложение ватермарка

Как всегда для Django есть уже готовая библиотека, но нам же интересно самим всё сделать, правда ведь? :) В качестве водяного знака возьмём вот этого котика, повёрнутого на 45 градусов. Нууу… все же любят котиков…

Watermark

Таким вот образом можно наложить изображения друг на друга, но на водяной знак это смахивает лишь очень отдалённо. Хм, opacity 0.1, rotate 30 . Кстати, тут мы работаем с прозрачными изображениями, так что вместо обычного метода Image.paste надо использовать Image.alpha_composite - он сохраняет альфа-каналы.

Watermark result

Склейка изображений

Ещё один пример работы с изображениями - компоновка нескольких в одно. Как пример это может быть массив спрайтов (для web) или фреймов для анимации какой-нибудь 2D игрушки (Да-да, я знаю, что велосипедов и так уже полно, и некоторые даже работают, но у них есть фатальный недостаток :) ). Мне же понадобилось из картинок-элементов собрать таблицу Менделеева. Так что код из рабочего проекта:

Склейка изображения

В images передаётся матрица из объектов типа Image . В первом блоке вычисляются размеры результирующего холста, а во втором вставляются картинки согласно элементам матрицы. Если будет интересно, то в комментариях могу выложить полный код по склейке таблицы Менделеева из готовых png и саму таблицу для печати.

Генерация gif

Переходим к генерации gif из получившихся картинок. Вот здесь всё несколько неочевидно. Беглое гугление говорит, что есть специальная библиотечка images2gif (только python2), однако сам автор просит её не использовать. Некоторые предлагают вызывать convert -delay 20 -loop 0 *jpg animated.jpg , но что-то всё это костылями попахивает, неужели сам Pillow не умеет склеивать png в gif?! Конечно же умеет! Причём сам, без библиотеки pillow-images2gif. Пусть у нас в каталоге data/png находятся 10 файлов вида 000.jpg, 001.jpg, 002.jpg… Тогда склеить их в один gif можно таким кодом:

Это код для Python3, так что map пришлось распаковать в список. Ух, прям обожаю функциональщину - так много делается всего в одной строчке :) С помощью внутреннего map создаётся итератор по списку Image для каждого файла, а потом к каждому Image применяется функция prepare. Её назначение заключается лишь в подготовке кадра - привести к одному размеру и сделать фон белым вместо прозрачного. К сожалению, иного способа кроме как положить png (переменная img) на белый холст (переменная bg) для удаления прозрачности я не нашёл. Согласен, как-то некрасиво получается… Зато потом одной командой save оно само как-то всё склеивается. Посмотреть можно здесь.

А теперь наоборот

Зачастую надо не собрать gif из картинок, а наоборот разбить (а потом, возможно, сохранить в новый gif). Pillow умеет и это:

Нельзя просто так взять и сохранить gif по кадрам

К сожалению, здесь может быть не так просто из-за формата gif. В нём каждый кадр может содержать свою собственную палитру. Это помогает в уменьшении размеров файла, но накладывает дополнительные трудности при работе с ним. Причём палитра может вычисляться как дифф от предыдущего кадра с одним “прозрачным” цветом. То есть, надо накапливать разницу цветов, учитывая ту же прозрачность, но поля этого блога слишком малы, чтобы привести решение :)

Бывает такой заходишь на почту и видишь очередную подборку статей, которые никогда не прочитаешь, но тут так сошлись звезды, что и открыл статью, и прочел, и придумал, где на практике пригодится. А теперь хочу поделиться статьей с Хабром, чтобы если кому-то нужен будет простой и понятный гайд по работе с изображениями на Python — пожалуйста.

Pillow — это свободно распространяемая библиотека для работы с изображениями (далее Imaging Library) на Python с открытым исходным кодом, которая добавляет вашему коду поддержку открытия, изменения и сохранения изображений в различных расширениях.

Давайте начнем

Самый важный класс в Imaging Library Python — это класс Image, определенный в одноименном модуле. Мы используем open(), чтобы открыть изображение в нашей локальной директории, как показано ниже:

Это просто! Теперь вы умеете считывать изображения с помощью Pillow, а значит можно приступать к обработке изображения с его помощью. Вы также можете проверить тип изображения, которое мы только что загрузили.

Вы можете посмотреть свойства изображения, например:

Кроме того, вы можете вывести на экран изображение, используя метод show


Конвертирование расширения изображения

Когда вы закончите работать с изображением при помощи библиотеки Pillow в изначальном расширении, вы можете пересохранить его в других форматах, например, их jpg сделать png или многие другие.

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


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

Обрезка изображения

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


Как мы видим, изображение было успешно обрезано. Координаты обрезанной поверхности представлены диагональными координатами.

При этом первые две точки находятся (x, y) от верхней левой диагональной точки, а следующие две точки (x2, y2) также являются диагональной точкой снизу справа.

Геометрическое преобразование

С помощью Pillow мы можем выполнять некоторые геометрические преобразования над изображением, включая изменение размера и поворот изображения.

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

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

Когда вы запустите приведенный выше код, вы должны увидеть новое изображение с измененным размером в вашем каталоге с размером 320 на 320.

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


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

Генератор изображений

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


Фильтрация изображений

Фильтрация — это метод изменения или улучшения изображения. Например, вы можете отфильтровать изображение, чтобы выделить определенные особенности или удалить другие.

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

В библиотеке Pillow доступно множество фильтров, включая BLUR, BoxBlur, CONTOUR, FIND_EDGES, Filter, GaussianBlur, Kernel, MaxFilter, MedianFilter, SHARPEN, SMOOTH и т.д.

Пример использования

Давайте попробуем найти края на изображении ниже, используя фильтр FIND_EDGES.


Таким же образом вы можете экспериментировать с другими фильтрами в Python библиотеке Pillow в зависимости от того, что вы пытаетесь сделать.

Чтение изображения из открытого файла

Кроме того, вы можете использовать Pillow для чтения изображения из файлового объекта Python, как показано ниже

Чтение изображения из URL

В этом случае вам придется использовать Pillow в сочетании с запросами. Запросы должны будут отправлять GET-request на сервер, чтобы получить необработанные байты изображения, а уже Pillow считает эти байты.


Создание новых изображений

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

Синтаксис:

Пример использования:


Рисование прямоугольников на изображениях

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

Пример исползования

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


Первые две координаты представляют (x, y) левой верхней части, а следующие две (x2, y2) представляют координатную точку правой нижней части.

Рисование текста на изображениях

Мы также можем использовать библиотеку Pillow для рисования текста на изображениях.

Порой нужно выполнить рутинное действие, вроде добавления своего значка на картинку, или обрезки изображения. И, если для 2-3 изображений, это не составляет труда, то для 50-ти это превращается в пытку. К счастью, на Python легко автоматизировать любые задачи, включая обработку изображений.

Для работы понадобится библиотека Pillow, для установки введите в консоли.

Открываем изображение.

Перепишите следующий код.

Из библиотеки PIL загружаем модуль Image

Открываем файл картинки. В Image.open, нужно передать путь до картинки.

Показываем её в программе по умолчанию.


Изображение открылось.

Заметьте, открытие изображения Image.open() крайне похоже на открытие файла open(). Что означает:

  • Изображение, также нужно закрывать im.close()
  • Его можно обернуть в блок with, тогда файл изображения закроется автоматически, при выходе из блока.

Для сохранения изображения, используйте.

название_изображения замените на свое.

Открываем множество изображений.

Для работы потребуется библиотека glob.

Предположим, все изображения хранятся в папке images


Тогда, данный скрипт:

Вернет, массив путей к изображениям image_list. Далее, обрабатываем картинки как угодно. Например, так:

где, improve_image — вымышленная функция, которая улучшает изображение.

Обрезаем изображение.

В данной строке

Я вырезал прямоуголник, в диапазоне от 0,0 (лево-верхний угол) до 32, 32 в пикселях.


По итогу, получили следующее.


Меняем размер изображения.

Менять размер будем методом resize

Который, в качестве аргумента, принимает размер изображения.


Растянул кружу, до 500 пикселей

Уменьшаем изображение, сохраняя пропорции.

Метод thumbnail, уменьшает изображение до введенного размера, с сохранением пропорций, подробнее в документации.


Результат работы скрипта

Получилось мыло, связано это с тем, что используется сглаживаение. Отключим его.


Вставляем одно изображение, в другое.

Перепишите следующий код.

Сначала, откроем 2 изображения. Каждое изображение я конвертировал в формат RGBA.

И вставил в изображение фона, изображение кружки.


На выходе, получили следующее.


Также, можно указать координаты вставки изображения, добавив 2-ой аргумент.

Увеличиваем контрастность

Здесь потребуется модуль ImageEnhance

Выбираем контрастность

И увеличиваем её на 80%.

И выводим на экран.


ImageEnchace, остальные функции.

Помимо этого, ImageEnhance может обезцветить изображение.


Изменить уровень освещенности.


Поменять резкость.


Уменьшаем палитру изображения (квантование).

Урезать палтру можно 3-мя способами.


Изображение урезанное до 16-ти цветов.

Первый.

  • количество_цветов — указывает максимальное количестуво цветов в изображении.

Количество цветов уменьшится, однако, размер палитры не изменится.

Второй.

Ничем не отличается от предыдущего.

Третий.

Используйте скрипт урезания палитры из SGDK. Импорт палитры.

Данный способ самый лучший, т.к. уменьшает не только количество цветов, но и размер палитры. Плюс, позволяет менять dithering.

Отражаем по ветикали и горизонтали.

Изображение можно отразить по вертикали.


И, по горизонтали.


Поворачиваем изображение.

Для поворота изображения, используется rotate, который, в качестве аргумента, принимает угол поворота.


Заключение.

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

Обработка и генерация изображений в Python. Библиотека Pillow

Нередко нам нужно изменить размер картинки, кропнуть ее, наложить текст и так далее. Все это можно автоматизировать с помощью Python и библиотеки Pillow.

Установка Pillow

Установка производится через pip3. Вводим в консоль:

Начало работы с библиотекой

Для начала нам нужно инициализировать библиотеку в нашем скрипте:

В папку со скриптом поместим произвольное изображение. Файл назовем test.jpg.

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

На экране у нас отобразилось изображение, которое мы добавили в папку:

Pillow Python

Для просмотра основной информации об изображении с помощью Pillow используем следующие методы:

Обрезка изображений

В Pillow есть методы для кропа (обрезки) изображений. Обрежем наше изображение с помощью метода crop(), передав в параметры координаты обрезки:

После выполнения данного кода, получим следующее изображение:

Фото в Pillow Python

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

С помощью метода Image.rotate() мы можем поворачивать изображение как нам угодно. В скобках указываем количество градусов, на которое нужно повернуть изображение. Рассмотрим на примере:

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

Конвертируем из JPG в PNG с помощью Pillow

Для конвертации нам понадобится открыть изображение и просто сохранить его в другом формате. Рассмотрим на примере:

Получаем такое же изображение, но в формате PNG.

Изменение размера изображений

Чтобы изменить размер изображения используем метод resize(). Рассмотрим это на примере:

Кроп в Pillow Python

Пишем текст на изображениях

Для наложения текста на изображение в Pillow существует метод text(), но для начала нужно добавить шрифт. Рассмотрим на примере:

Получим изображение с текстом:

Текст на изображении - Pillow Python

Генерация пустого изображения

Для создания пустого холста (изображения) используем метод Image.new(). Рассмотрим на примере:

Получаем черный квадрат:

Работа с Pillow Python

Теперь давайте нарисуем на этом квадрате белый прямоугольник:

Рисование в Pillow Python

Вывод

Мы разобрали основные методы библиотеки Pillow в Python: научились писать текст на изображениях, изменять размер, поворачивать их и даже обрезать.

Читайте также: