from PIL import Image img = Image.composite(im1, im2, mask)
im1
- первое изображение/картинка.im2
- второе изображение/картинка. Должно иметь тот же режим и размер, что и первое изображение.mask
- изображение маски. Это изображение может иметь режим 1
, L
или RGBA
и должно иметь тот же размер, что и два других изображения.Image
.Функция Image.composite()
модуля Pillow
создает составное изображение путем смешивания изображений с использованием маски прозрачности.
Image.resize()
.Image.convert()
.Если делать такое в NumPy
, то формула по которой расчитывается объединение изображений и маски будет следующая:
для маски в режиме `1` arr_result = arr_mask * arr_image1 + (1 - arr_mask) * arr_image2 для маски в режиме `L` arr_result = arr_mask / 255 * arr_image1 + (1 - arr_mask / 255 ) * arr_image2
Как обрабатывать изображения в NumPy
смотрите:
Pillow
".Создайте два скриншота, например рабочего стола и этой страницы сайта при помощи следующего кода. В общем нужны две разные картинки.
from PIL import ImageGrab import time # сделаем скриншоты с задержкой в 2 секунды # запускаем скрипт и переключаемся на рабочий стол time.sleep(2) # создание скриншота scr1 = ImageGrab.grab() # сохраняем скриншот scr1.save('scr1.jpg') # считаем до двух и переключаемся на окно браузера time.sleep(3) scr2 = ImageGrab.grab() scr2.save('scr1.jpg')
Далее сделаем "виньетку" из этих двух картинок, объединив их по маске (белый прямоугольник на черном фоне).
from PIL import Image, ImageDraw, ImageFilter # открываем скриншот рабочего стола scr1 = Image.open('scr1.jpg') # открываем скриншот окна сайта scr2 = Image.open('scr2.jpg') # создадим черно-белую маску # такого же размера как и скриншоты mask = Image.new('L', scr1.size, 0) # получаем контекст рисования d = ImageDraw.Draw(mask) # по центру нарисуем прямоугольник # зададим отступ от краев indent = 200 # рассчитаем координаты прямоугольника size = (indent, indent, scr1.size[0] - indent, scr1.size[1] - indent) # рисуем прямоугольник d.rectangle(size, fill=255) #################################### # накладываем изображений по маске # #################################### img = Image.composite(scr2, scr1, mask) # сохраняем и смотрим что получилось img.save('test_composite.png') # теперь размоем маску фильтром GaussianBlur() mask = mask.filter(ImageFilter.GaussianBlur(20)) img = Image.composite(scr2, scr1, mask) # сохраняем и смотрим что получилось img.save('test_composite_blur.png') # или в качестве маски используем линейный градиент mask = Image.linear_gradient('L').resize(scr1.size) img = Image.composite(scr2, scr1, mask) # сохраняем и смотрим что получилось img.save('test_linear_gradient.png') # радиальный градиент mask = Image.radial_gradient('L').resize(scr1.size) img = Image.composite(scr2, scr1, mask) # сохраняем и смотрим что получилось img.save('test_radial_gradient.png')