Pillow Paste() — вставка одного изображения в другое изображение в Python

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()

В процессе выполнения этого кода мы получаем следующий результат.Pillow Paste() - вставка одного изображения в другое изображение в Python

У метода 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 пикселей.Pillow Paste() - вставка одного изображения в другое изображение в Python

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

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 Paste() - вставка одного изображения в другое изображение в Python

Как применять маску в Pillow?

Третий параметр – это mask (маска). Это означает, что картинку, которая встраивается в окно программы, можно обрезать и вставить не только в форме прямоугольника, но и любой другой в зависимости от того, какая форма маски, которая применяется. Маски могут быть самой разной формы, и в качестве них можно использовать геометрические фигуры или реальные изображения.

Картинка, которая будет использоваться в качестве маски, должна иметь такую же ширину и высоту, как и встраиваемая. Также в ней должны быть такие три типа режима mode.

  1. 1: 1-битное изображение (то есть, бинарное).
  2. L: 8-битная картинка, которая является черно-белой.
  3. 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 Paste() - вставка одного изображения в другое изображение в Python

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

Осуществление процесса вставки происходит путем использования этого изображения в качестве маски. 

Что будет с этой маской?

  1. Все темные пиксели будут использоваться в качестве меток для удаления данного пикселя из картинки с Гвидо Ван Россумом.
  2. Светлая часть маски оставляет пиксели такими, какими они есть.
  3. Если пиксели серые (то есть, по цвету занимают промежуточное положение между белыми и черными, то эта часть будет прозрачной лишь на несколько процентов). 
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()

Если использовать маску, которая приводится в этом коде, получим такой результат. Как мы видим, из картинки были удалены все фрагменты с черным пикселем.Pillow Paste() - вставка одного изображения в другое изображение в Python

Когда мы используем модуль 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()

 Маска наша теперь такая.

Pillow Paste() - вставка одного изображения в другое изображение в Python

А после того, как мы использовали эту маску, у нас получился следующий результат. Красиво, не так ли?

В целом, маска может быть любая, не обязательно ограничиваться исключительно геометрическими фигурами. Например, можно использовать в качестве маски такое изображение с черно-белой бабочкой. Pillow Paste() - вставка одного изображения в другое изображение в Python

После того, как была открыта картинка с помощью метода 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()

Если попробовать запустить этот фрагмент кода, то результат мы получим следующий.Pillow Paste() - вставка одного изображения в другое изображение в Python

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

ОфисГуру
Adblock
detector