Pillow – это известная библиотека Python, которая используется для продвинутой работы с изображениями. С ее помощью можно упростить множество операций с ними. Конечно, эта библиотека уже не развивается, как раньше. Тем не менее, многие пользователи по-прежнему ее используют. В этом нет ничего удивительного, поскольку этот форк PIL поддерживает огромное количество возможностей. Среди них работа с анимацией, рисование и ряд других.
Сегодня поговорим о том, как накладывать одну картинку на другую в этой библиотеке. Чтобы это сделать, не надо прикладывать никаких особых усилий. Весь процесс интуитивно понятный.
Помните, что эта библиотека поддерживает работу с форматами BMP, EPS, GIF, IM, JPEG, MSP, PCX PNG, PPM, TIFF, WebP, ICO, PSD, PDF. То есть, по сути все типы изображений поддерживаются. Но если вдруг вы решите использовать некоторые векторные форматы, это не получится сделать.
Если нам надо одно изображение вставить в другое, необходимо использовать метод paste(), который находится в библиотеке Pillow. Сегодня подробно поговорим о том, как выполняется вставка изображения, как задавать координаты для вставки. Также мы разберем, что такое маска, и как она используется, чтобы вставлять определенную форму.
Напомним, что все базовые функции по работе с картинками располагаются в модуле Image. Для создания картинок используется одноименный объект.
Как установить библиотеку Pillow?
Для начала нам надо импортировать модуль Image, который находится в этой библиотеке. Именно он отвечает за работу со всеми изображениями в рамках этой библиотеки. Но это невозможно сделать, если она вообще отсутствует на компьютере. В этом случае ее надо установить. Чтобы сделать это, необходимо воспользоваться такой командой (убедитесь, что стоит менеджер пакетов PyPI).
После этого, введите следующую инструкцию Python.
pip install Pillow
Чтобы создать маску, нами будут использоваться модули ImageDraw и ImageFilter. Если вам достаточно лишь вставить картинку, то можно этот момент пропустить.
from PIL import Image im1 = Image.open('guido-van-rossum.jpg') im2 = Image.open('fon.jpg')
Чтобы работать дальше, необходимо сохранить следующие две картинки. Мы будем накладывать изображение человека, который создал язык, который вы изучаете на фон, а потом выполнять с ним различные действия, применять эффекты, и так далее.
guido-van-rossum.jpg (человек, создавший язык программирования Python);
fon.jpg (Фоновое изображение).
Использование pillow для обычной вставки изображения
Чтобы вставить изображение, необходимо воспользоваться методом paste(). Он очень простой в использовании, поскольку задействует только один аргумент. Вызов осуществляется от изображения фона, а в скобках нужно указать картинку, которая будет вставляться. В нашем случае файл с фоном будет называться fon.jpg, а изображение с создателем Python – guido-van-rossum.jpg.
По умолчанию картинка вставляется в левой верхней части фонового изображения.
from PIL import Image im1 = Image.open('fon.jpg') im2 = Image.open('guido-van-rossum.jpg') im1.paste(im2) im1.save('fon_pillow_paste.jpg', quality=95) im1.close() im2.close()
В процессе выполнения этого кода мы получаем следующий результат.
У метода paste есть недостаток. Он переписывает объект фонового изображения. Следовательно, если вам необходимо сохранить оригинальную картинку, которая хранилась в переменной im1, то необходимо скопировать объект уже открытого изображения с помощью метода copy().
from PIL import Image im1 = Image.open('fon.jpg') im2 = Image.open('guido-van-rossum.jpg') back_im = im1.copy() back_im.paste(im2) back_im.save('fon_pillow_paste.jpg', quality=95) im1.close() im2.close()
Координаты для вставки картинки
Позиция, на которую осуществляется вставка картинки, указывается с помощью кортежа (координата x верхнего левого угла, координата y верхнего левого угла) во втором параметре box.
Напомним, что кортеж – это итерируемый объект с неизменяемыми значениями. Все объекты, которые в него включены, записываются в скобках.
from PIL import Image im1 = Image.open('fon.jpg') im2 = Image.open('guido-van-rossum.jpg') im1.paste(im2, (100, 50)) im1.save('fon_pillow_paste_pos.jpg', quality=95) im1.close() im2.close()
Ниже мы привели фрагмент изображения, которое должно получиться в результате исполнения этого кода. Попробуйте запустить его у себя, используя картинки, которые были скачаны ранее. В нашем случае картинка была вставлена таким образом, чтобы смещение слева было 100 пикселей, а сверху – 50 пикселей.
Если картинка, которая встраивается, оказывается за пределами фонового изображения, то лишняя область просто окажется там. То есть, на экране будет отображаться лишь часть картинки.
from PIL import Image im1 = Image.open('fon.jpg') im2 = Image.open('guido-van-rossum.jpg') im1.paste(im2, (450, 100)) im1.save('fon_pillow_paste_out.jpg', quality=95) im1.close() im2.close()
Как применять маску в Pillow?
Третий параметр – это mask (маска). Это означает, что картинку, которая встраивается в окно программы, можно обрезать и вставить не только в форме прямоугольника, но и любой другой в зависимости от того, какая форма маски, которая применяется. Маски могут быть самой разной формы, и в качестве них можно использовать геометрические фигуры или реальные изображения.
Картинка, которая будет использоваться в качестве маски, должна иметь такую же ширину и высоту, как и встраиваемая. Также в ней должны быть такие три типа режима mode.
- 1: 1-битное изображение (то есть, бинарное).
- L: 8-битная картинка, которая является черно-белой.
- RGBA – цветное изображение RGB, в котором есть также альфа-канал (он отвечает за то, чтобы в программе была возможность задавать прозрачный цвет).
Когда маска 8-битная (то есть, черно-белая), то в этом случае при значении маски 0, а встраиваемой картинки – 255 видно фон. Если же используются другие значения, то обе картинки сливаются в полном соответствии с ними.
Давайте для примера попробуем нарисовать белый круг на черном фоне. Для этого необходимо воспользоваться модулем ImageDraw, который будет генерировать маску. Приведем фрагмент кода, который будет использоваться для реализации поставленной задачи на практике.
from PIL import Image, ImageDraw mask_im = Image.new("L", im2.size, 0) draw = ImageDraw.Draw(mask_im) draw.ellipse((100, 10, 270, 180), fill=255) mask_im.save('data/dst/mask_circle.jpg', quality=95)
Вообще, рисование с помощью Pillow – это отдельная тема, которую нужно рассматривать отдельно.
Осуществление процесса вставки происходит путем использования этого изображения в качестве маски.
Что будет с этой маской?
- Все темные пиксели будут использоваться в качестве меток для удаления данного пикселя из картинки с Гвидо Ван Россумом.
- Светлая часть маски оставляет пиксели такими, какими они есть.
- Если пиксели серые (то есть, по цвету занимают промежуточное положение между белыми и черными, то эта часть будет прозрачной лишь на несколько процентов).
from PIL import Image, ImageDraw im1 = Image.open('fon.jpg') im2 = Image.open('guido-van-rossum.jpg') mask_im = Image.new("L", im2.size, 0) draw = ImageDraw.Draw(mask_im) draw.ellipse((100, 10, 270, 180), fill=255) im1.paste(im2, (0, 0), mask_im) im1.save('fon_pillow_paste_mask_circle.jpg', quality=95) im1.close() im2.close() mask_im.close()
Если использовать маску, которая приводится в этом коде, получим такой результат. Как мы видим, из картинки были удалены все фрагменты с черным пикселем.
Когда мы используем модуль ImageFilter, чтобы размывать маску, то мы также можем смешивать и вставлять границы.
from PIL import Image, ImageDraw, ImageFilter im1 = Image.open('fon.jpg') im2 = Image.open('guido-van-rossum.jpg') mask_im = Image.new("L", im2.size, 0) draw = ImageDraw.Draw(mask_im) draw.ellipse((100, 10, 270, 180), fill=255) mask_im_blur = mask_im.filter(ImageFilter.GaussianBlur(10)) im1.paste(im2, (0, 0), mask_im_blur) im1.save('fon_pillow_paste_mask_circle_blur.jpg', quality=95) im1.close() im2.close() mask_im.close()
Маска наша теперь такая.
А после того, как мы использовали эту маску, у нас получился следующий результат. Красиво, не так ли?
В целом, маска может быть любая, не обязательно ограничиваться исключительно геометрическими фигурами. Например, можно использовать в качестве маски такое изображение с черно-белой бабочкой.
После того, как была открыта картинка с помощью метода open(), она приспособится к размеру изображения, которое вставляется. Правда, для этого необходимо использовать метод resize(), а чтобы осуществить конвертацию режима в черно-белый, мы применили метод convert(). Вот пример кода, который наглядно это демонстрирует.
from PIL import Image im1 = Image.open('fon.jpg') im2 = Image.open('guido-van-rossum.jpg') mask_im = Image.open('butterfly.jpg').resize(im2.size).convert('L') im1.paste(im2, (100, 100), mask_im) im1.save('fon_pillow_paste_mask_butterfly.jpg', quality=95) im1.close() im2.close() mask_im.close()
Если попробовать запустить этот фрагмент кода, то результат мы получим следующий.
Конечно, этот пример далек от идеала. Ведь форма эта довольно непростая, и на практике она не будет использоваться почти никогда. А вот если маска имеет форму звездочки, то найти ей применение вполне возможно.