Доброго здоровья читателям моего канала 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.
Самое интересное начинается тогда, когда используем маску. Обычно используется 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.
С маской можно "выделывать" разные интересные штуки. Сделаем мордочку кота в круглой рамке.
#!/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).
Конечно, этим работа с маской не закончена. Ведь к ней можно применить различные фильтры.
#!/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
Ну и всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.