介紹如何在 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)
