from PIL import Image img = Image.alpha_composite(im1, im2)
im1
- первое изображение/картинка. Должна быть в режима RGBA
.im2
- второе изображение/картинка. Должна быть в режима RGBA
и иметь тот же размер, что и первое изображение.Image
.Функция Image.alpha_composite()
модуля Pillow
накладывает изображение im2
на изображение im1
. Другими словами функция представляет собой альфа-композицию im2
поверх im1
.
Image.resize()
.'RGB'
в 'RGBA'
можно методом Image.convert()
.В этом примере сделаем скриншот рабочего стола и наложим на него картинку с текстом
from PIL import (Image, ImageFont, ImageGrab, ImageDraw) import time # сделаем скриншот # задержка в 2 секунды, для того, # чтобы переключиться на рабочий стол time.sleep(2) # создание скриншота tmp = ImageGrab.grab() # конвертируем скриншот из 'RGB' в 'RGBA' scr1 = tmp.convert('RGBA') # сохраним, понадобится для следующего примера scr1.save('scr1.png') # изображение, которое будем накладывать # создадим прозрачную подложку, размером со скриншот scr2 = Image.new("RGBA", scr1.size , (0, 0, 0, 0)) # получаем контекст рисования d = ImageDraw.Draw(scr2) # подключим шрифт fnt = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeSerifBold.ttf", size=100) # координаты привязки текста xy = (scr1.size[0]//2, scr1.size[1]//2) # накладываем текст с прозрачностью 80 на прозрачную подложку d.text(xy, "DOCS-PYTHON.RU", font=fnt, anchor="ms", fill=(255, 255, 255, 80)) # сохраним, понадобится для следующего примера scr2.save('scr2.png') ########################## # накладываем изображения # ########################## img = Image.alpha_composite(scr1, scr2) # сохраняем и смотрим что получилось img.save('test.png')
Следующий пример делает что то подобное, но при помощи NumPy
. Обратите внимание, что NumPy
не накладывает одно изображение на другое, а смешивает (out_image = image1 * (1.0 - alpha) + image2 * alpha
).
Другими словами, это простая арифметическая операция сложения двух массивов изображений, при этом они не обязательно должны быть в режиме "RGBA", но размер массивов (т.е. картинок) должен быть одинаковый. Если картинки разного размера, то одну их них можно подогнать под другую методом Image.resize()
.
import numpy as np from PIL import Image # открываем скриншот scr1 = Image.open('scr1.png') # NumPy и Pillow понимают друг друга без # каких либо дополнительных преобразований arr_src1 = np.asarray(scr1) # открываем картинку с надписью scr2 = Image.open('scr2.png') # передаем ее в NumPy arr_src2 = np.asarray(scr2) ########################### # накладываем изображения # ########################### # наложение одного изображения на другое # это простая арифметическая операция # сложения двух массивов изображений dst_float = arr_src1 + arr_src2 * -0.15 dst_float1 = arr_src1 * 0.9 + arr_src2 * 0.1 print(dst_float.dtype) # float64 # для Pillow нужен тип `uint8` dst = dst_float.astype(np.uint8) dst1 = dst_float1.astype(np.uint8) # что получилось сохраняем Image.fromarray(dst).save('test_numpy.png') Image.fromarray(dst1).save('test_numpy1.png')