GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Python 3
  • Скачать Python
  • IDE
  • Скачать PyCharm
  • Django
  • Tkinter
  • Книги

This view

  • Original page
  • New address

GeezerVison is showing python-scripts.com — Pillow paste() - Вставка одного изображения в другое изображение

Уроки Pillow в Python

Метод paste() из библиотеки Pillow, предоставляет возможность вставки одного изображения в другое изображение.

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

  • Обычная вставка одного изображения в другое изображение;
  • Вставка изображения с указанием координат для вставки;
  • Использование маски.

Содержание статьи

  • Обычная вставка изображения через PIL
  • Координаты для вставки изображения
  • Использование маски для вставки определенной формы

Импортируем модуль Image из библиотеки PIL и открываем базовое (фоновое) изображение, куда будет производиться вставка другого изображения.

Установка библиотеки Pilllow

Shell
1
pip install Pillow

Модули ImageDraw и ImageFilter мы будем использовать для создания маски. Вы можете пропустить этот момент, если вам нужна простая вставка изображения.

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

Обычная вставка изображения через PIL

Вызываем метод paste() от изображения фона и указываем картинку для вставки.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Python Форум Помощи

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Чат
Канал

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Подписаться

По умолчанию изображение вставляется в верхней левой части фоновой картинки.

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

Результат выполнения данного кода:

Pillow уроки python

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

Python
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.

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, (100, 50))
im1.save('fon_pillow_paste_pos.jpg', quality=95)
 
im1.close()
im2.close()

Ниже мы увидим готовый результат. Изображение с Гвидо Ван Россумом была вставлена поверх другого изображения со смещением слева на 100 пикселей и смещение сверху на 50 пикселей.

Уроки Pillow

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

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, (450, 100))
im1.save('fon_pillow_paste_out.jpg', quality=95)
 
im1.close()
im2.close()

Уроки Pillow Python

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

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

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

  • 1: 1-битная картинка (бинарное изображение);
  • L: 8-битое черно-белое изображение;
  • RGBA: Картинка с альфа каналом (прозрачная).

Когда маска является 8-битной (черно-белой mode='L'), фон виден, когда значение маски равно 0 (черный), а встраиваемой картинки — 255 (белый). Для других значений обе картинки сливаются в соответствии со значением.

Нарисуем белый круг на черном фоне с помощью модуля ImageDraw для генерации маски.

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

Python PIL маска

Подробнее о рисовании с помощью Pillow можно прочесть в данной статье — Рисование круга, прямоугольника, линии в Python

Процесс вставки осуществляется через использование данной картинки как маски.

Что произойдет с данной маской?

  • Все темные пиксели маски будут использованы как метки для удаления этого пикселя из нашей картинки с Гвидо Ван Россумом;
  • Светлая часть маски оставит пиксели как есть;
  • Если пиксели маски серые (не совсем белые и не совсем черные), то данная часть будет прозрачной только на несколько процентов.

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

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

Pillow Маска примеры

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

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

У нас получилась такая маска:

Маска для PIL Python

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

Маска в Pillow Python

Модуль ImageDraw не ограничивается только геометрическими фигурами, маски могут вставляться в любой форме.

Попробуйте использовать вот такую картинку с черно-белой бабочкой.

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

После того, как метод open() откроет картинку, она приспособится к размеру встраиваемого изображения через использование метода resize(), а режим конвертируется в 'L' (черно-белое) через метод convert().

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

Полученный результат:

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

Это не самый лучший пример, форма довольно сложная, и случай для ее использования сложно придумать. А вот маскам со звездочками и сердечками можно найти применение.

Vasile Buldumac

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

E-mail: [email protected]

Образование
Universitatea Tehnică a Moldovei (utm.md)

  • 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
  • 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.