Сообщить об ошибке.

Функция Image.alpha_composite() модуля Pillow в Python

Альфа-композиция одной картинки поверх другой

Синтаксис:

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