Метод paste()
из библиотеки Pillow, предоставляет возможность вставки одного изображения в другое изображение.
В данной статье будут рассматриваться следующие аспекты:
- Обычная вставка одного изображения в другое изображение;
- Вставка изображения с указанием координат для вставки;
- Использование маски.
Содержание статьи
- Обычная вставка изображения через PIL
- Координаты для вставки изображения
- Использование маски для вставки определенной формы
Импортируем модуль Image
из библиотеки PIL и открываем базовое (фоновое) изображение, куда будет производиться вставка другого изображения.
Установка библиотеки Pilllow
1 |
pip install Pillow |
Модули ImageDraw
и ImageFilter
мы будем использовать для создания маски. Вы можете пропустить этот момент, если вам нужна простая вставка изображения.
1 2 3 4 |
from PIL import Image im1 = Image.open('guido-van-rossum.jpg') im2 = Image.open('fon.jpg') |
Сохраните эти два изображения:
- guido-van-rossum.jpg (создатель языка программирования Python);
- fon.jpg (Фоновое изображение).
Обычная вставка изображения через PIL
Вызываем метод paste()
от изображения фона и указываем картинку для вставки.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
По умолчанию изображение вставляется в верхней левой части фоновой картинки.
1 2 3 4 5 6 7 8 9 10 |
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()
.
1 2 3 4 5 6 7 8 9 10 11 |
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() |
Координаты для вставки изображения
Позиция для вставки картинки указывается с помощью кортежа (координата х верхнего левого угла, координата y верхнего левого угла) во втором параметре box
.
1 2 3 4 5 6 7 8 9 10 |
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 пикселей.
Если встраиваемое изображение выходит за пределы фоновой картинки, то лишняя область просто исчезнет за пределы фонового изображения.
1 2 3 4 5 6 7 8 9 10 |
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
: Картинка с альфа каналом (прозрачная).
Когда маска является 8-битной (черно-белой mode='L'
), фон виден, когда значение маски равно 0 (черный), а встраиваемой картинки — 255 (белый). Для других значений обе картинки сливаются в соответствии со значением.
Нарисуем белый круг на черном фоне с помощью модуля ImageDraw
для генерации маски.
1 2 3 4 5 6 |
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 можно прочесть в данной статье — Рисование круга, прямоугольника, линии в Python
Процесс вставки осуществляется через использование данной картинки как маски.
Что произойдет с данной маской?
- Все темные пиксели маски будут использованы как метки для удаления этого пикселя из нашей картинки с Гвидо Ван Россумом;
- Светлая часть маски оставит пиксели как есть;
- Если пиксели маски серые (не совсем белые и не совсем черные), то данная часть будет прозрачной только на несколько процентов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
, границы можно смешивать и вставлять.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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() |
У нас получилась такая маска:
Вот и готовый результат с применением данной маски:
Модуль ImageDraw
не ограничивается только геометрическими фигурами, маски могут вставляться в любой форме.
Попробуйте использовать вот такую картинку с черно-белой бабочкой.
После того, как метод open()
откроет картинку, она приспособится к размеру встраиваемого изображения через использование метода resize()
, а режим конвертируется в 'L'
(черно-белое) через метод convert()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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() |
Полученный результат:
Это не самый лучший пример, форма довольно сложная, и случай для ее использования сложно придумать. А вот маскам со звездочками и сердечками можно найти применение.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»