Найти в Дзене

Программирование на python. Наложение одного изображения на другое средствами библиотеки pillow

Доброго здоровья читателям моего канала programmer's notes. Поддерживаем канал по программированию на Python.

Наложение одного изображения на другое средствами библиотеки pillow

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

Наложить одну картинку на другую можно с помощью метода paste(). Я, кстати, о нём писал. Но пришло время познакомиться с ним ближе.

Пусть у меня есть две картинки. Одна картинка пейзаж, а другая голова кота. Поэкспериментируем с ними. Начнём с простого варианта.

#!/usr/bin/python3
from PIL import Image
img1 = Image.open('./1.jpg', mode='r') # пейзаж
img2 = Image.open('./2.jpg', mode='r') # голова кота
# сделаем удобный размер
img1.thumbnail((600, 600))
img2.thumbnail((250, 250))
newf = './3.jpg' # результирующий файл
# наложить одну картинку на другую
# указав координаты накладываемой картинки
img1.paste(img2, (100, 100))
img1.save(newf, 'jpeg') # сохраняем результат
img1.close()
img2.close()

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

Рисунок 1. Результат простого наложения одной картинки на другую
Рисунок 1. Результат простого наложения одной картинки на другую

Самое интересное начинается тогда, когда используем маску. Обычно используется L - чёрно белая, точнее оттенки серого от 0 до 255 (8 битовая). При значении 0 картинка полностью перекрывается, 255 - полная прозрачность. Сама маска это тоже картинка. Обычно её берут размером накладываемой картинки.

#!/usr/bin/python3
from PIL import Image
img1 = Image.open('./1.jpg', mode='r') # пейзаж
img2 = Image.open('./2.jpg', mode='r') # голова кота
# сделаем удобный размер
img1.thumbnail((600, 600))
img2.thumbnail((250, 250))
# создать маску L - оттенки серого 0 - 255
maska = Image.new("L", img2.size, 127)
newf = './3.jpg' # результирующий файл
# наложить одну картинку на другую
# указав координаты накладываемой картинки
img1.paste(img2, (100, 100), maska)
img1.save(newf, 'jpeg') # сохраняем результат
img1.close()
img2.close()

Маска (maska) создаётся как обычная чёрно-белая картинка. Потом мы указываем её в методе paste() в качестве третьего параметра. Результат видно на рисунке 2.

Рисунок 2. Накладываем с маской 127 - полупрозрачность.
Рисунок 2. Накладываем с маской 127 - полупрозрачность.

С маской можно "выделывать" разные интересные штуки. Сделаем мордочку кота в круглой рамке.

#!/usr/bin/python3
from PIL import Image, ImageDraw
img1 = Image.open('./1.jpg', mode='r') # пейзаж
img2 = Image.open('./2.jpg', mode='r') # голова кота
# сделаем удобный размер
img1.thumbnail((600, 600))
img2.thumbnail((250, 250))
# создать маску L - оттенки серого 0 - 255
maska = Image.new("L", img2.size, 0) #чёрный цвет
dr = ImageDraw.Draw(maska)
dr.ellipse((50, 50, 180, 180), 200)
#maska = Image.new("RGBA", img2.size, 100)
newf = './3.jpg' # результирующий файл
# наложить одну картинку на другую
# указав координаты накладываемой картинки
img1.paste(img2, (100, 100), maska)
img1.save(newf, 'jpeg') # сохраняем результат
img1.close()
img2.close()

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

Рисунок 3. Круглое изображение
Рисунок 3. Круглое изображение

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

#!/usr/bin/python3
from PIL import Image, ImageDraw, ImageFilter
img1 = Image.open('./1.jpg', mode='r') # пейзаж
img2 = Image.open('./2.jpg', mode='r') # голова кота
# сделаем удобный размер
img1.thumbnail((600, 600))
img2.thumbnail((250, 250))
# создать маску L - оттенки серого 0 - 255
maska = Image.new("L", img2.size, 0)
dr = ImageDraw.Draw(maska)
dr.ellipse((50, 50, 180, 180), 200)
#сделаем размытость
maska = maska.filter(ImageFilter.GaussianBlur(60))
newf = './3.jpg' # результирующий файл
# наложить одну картинку на другую
# указав координаты накладываемой картинки
img1.paste(img2, (100, 100), maska)
img1.save(newf, 'jpeg') # сохраняем результат
img1.close()
img2.close()

Мы использовали фильтр размытости. Результат см. на рисунке 4

Рисунок 4. Изображение с размытостью
Рисунок 4. Изображение с размытостью

Ну и всё!

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

И тогда Кот стал исчезать очень медленно: первым растворился в воздухе его хвост, а последней — улыбка. Кот уже весь исчез, а улыбка его ещё была видна.
И тогда Кот стал исчезать очень медленно: первым растворился в воздухе его хвост, а последней — улыбка. Кот уже весь исчез, а улыбка его ещё была видна.