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

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

Смешивание двух картинок модулем Pillow в Python

Синтаксис:

from PIL import Image

img = Image.blend(im1, im2, alpha)

Параметры:

  • im1 - первое изображение/картинка. Должна быть в режима RGBA.
  • im2 - второе изображение/картинка. Должна иметь тот же режим и размер, что и первое изображение.
  • alpha - альфа-фактор интерполяции. Если альфа равна 0,0, то возвращается копия первого изображения. Если альфа равна 1,0, то возвращается копия второго изображения. Ограничений по альфа-значению нет. При необходимости результат обрезается, чтобы соответствовать допустимому выходному диапазону.

Возвращаемое значение:

  • Объект изображения Image.

Описание:

Функция Image.blend() модуля Pillow создает новое изображение путем интерполяции между двумя входными изображениями с использованием постоянной альфы.

Интерполяция происходи по формуле:

out_image = image1 * (1.0 - alpha) + image2 * alpha

alpha - фактор интерполяции. Если альфа равна 0,0, то возвращается копия первого изображения. Если альфа равна 1,0, то возвращается копия второго изображения. Ограничений по альфа-значению нет. При необходимости результат обрезается, чтобы соответствовать допустимому выходному диапазону.

  • Если картинки разного размера, то одну их них можно подогнать под другую методом Image.resize().
  • Если картинки имеют разный режим, то одну их них можно конвертировать методом Image.convert().

Примеры смешивания изображений.

В этом примере сделаем скриншот рабочего стола и смешаем с ним созданную картинку с текстом.

from PIL import (Image, ImageFont, 
                ImageGrab, ImageDraw)
import time

# сделаем скриншот
# задержка в 2 секунды, для того,  
# чтобы переключиться на рабочий стол
time.sleep(2)
# создание скриншота
scr1 = ImageGrab.grab()
# сохраним, понадобится для следующего примера
scr1.save('scr1.jpg')

# изображение, которое будем накладывать
# создадим подложку размером со скриншот
scr2 = Image.new("RGB", scr1.size)
# получаем контекст рисования
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)
# накладываем белый текст на подложку
d.text(xy, "DOCS-PYTHON.RU", font=fnt, anchor="ms", fill=(255, 255, 255))
# сохраним, понадобится для следующего примера
scr2.save('scr2.jpg')

##########################
# Смешиваем изображения  #
##########################
img = Image.blend(scr1, scr2, 0.2)
# сохраняем и смотрим что получилось
img.save('test.jpg')

Что бы было понятнее что происходи изобразим тоже самое при помощи NumPy.

import numpy as np
from PIL import Image

# открываем скриншот
scr1 = Image.open('scr1.jpg')
# NumPy и Pillow понимают друг друга без 
# каких либо дополнительных преобразований
arr_src1 = np.asarray(scr1)
# открываем картинку с надписью
scr2 = Image.open('scr2.jpg')
# передаем ее в NumPy
arr_src2 = np.asarray(scr2)

#########################
# смешиваем изображения #
#########################
# применим формулу к массивам изображений,  
# представленную в описании функции `Image.blend()`
alpha = 0.2
dst_float = arr_src1 * (1 - alpha) + arr_src2 * alpha

print(dst_float.dtype)
# float64 

# для Pillow нужен тип `uint8`
dst = dst_float.astype(np.uint8)
# что получилось сохраняем 
Image.fromarray(dst).save('test_numpy.jpg')