介绍如何在 Python 中使用 PIL.Image
的 blend()
或 composite()
函数以半透明的方式合并两张影像。
如果要将两张影像重叠起来,将两张影像变成半透明之后合并起来,可以使用 PIL.Image.blend() 函数来处理,以下是处理的步骤。
测试用图片
以下是本文中用来测试的两张图片。
测试图片一
测试图片二
更改影像大小
在合并之前,必须先确认两张影像的大小都是一致的。
from PIL import Image # 加载两张影像 img1 = Image.open("image1.jpg") img2 = Image.open("image2.jpg") # 检查两张影像大小是否一致 print(img1.size) print(img2.size)
(720, 480) (720, 480)
如果两张影像大小不同,可以考虑使用 resize()
调整影像大小:
# 指定目标图片大小 imgSize = (720, 480) # 改变影像大小 img1.resize(imgSize) img2.resize(imgSize)
另一种方式是采用 crop()
函数将两张影像裁切成相同的大小:
# 指定裁切大小 cropBox = ( 0, # left 0, # upper 720, # right 480 # lower ) # 裁切影像 img1.crop(cropBox) img2.crop(cropBox)
叠合影像
准备好两张相同大小的影像之后,即可使用 blend()
函数进行影像的叠合,而在叠合影像时要指定一个 alpha
值(代表透明度),blend()
函数会依照以下公式进行影像的叠合:
out = image1 * (1.0 - alpha) + image2 * alpha
以下是 alpha
指定为 0.5
的范例:
# 叠合影像 blendImg = Image.blend(img1, img2, alpha = 0.5) # 显示影像 blendImg.show()
叠合影像
不同的 alpha
值会有不同的效果:
# 叠合影像 blendImg = Image.blend(img1, img2, alpha = 0.3) # 显示影像 blendImg.show()
叠合影像
遮罩叠合影像
若要搭配遮罩来叠合两张影像,可以再另外准备好遮罩之后,改用 composite()
函数来处理。遮罩影像的格式可以是黑白图片("1"
)、灰阶图片("L"
)或含透明度的彩色图片("RGBA"
),以下是产生遮罩的范例:
from PIL import ImageDraw, ImageFilter # 产生遮罩影像 maskImg = Image.new("L", (720, 480)) # 绘制遮罩区域 maskDraw = ImageDraw.Draw(maskImg) maskDraw.ellipse((50, 50, 470, 430), fill=255) # 模糊化 maskImg = maskImg.filter(ImageFilter.GaussianBlur(30)) # 显示遮罩影像 maskImg.show()
遮罩影像
有了遮罩影像之后,即可使用 composite()
函数套用遮罩叠合影像:
# 套用遮罩叠合影像 Image.composite(img1, img2, maskImg)
套用遮罩叠合影像