如何使用PIL库叠加带透明背景的图片?
解决PIL库叠加带透明背景图片的问题
问题根源
- 最初的代码仅打开了两张图片,但完全没有执行叠加操作,直接保存背景图,自然看不到叠加效果。
- 第二次修改的代码调用方式错误:应该在背景图的实例上调用
paste方法,而非直接调用Image.Image.paste类方法,且参数传递不符合要求,导致报错。
修正后的代码
from PIL import Image bodyColorListDir = 'C:/Users/Home/Documents/neutral-cubes/body-color/' bodyColor_list = ['1.png', '2.png', '3.png', '4.png', '5.png', '6.png', '7.png', '8.png', '9.png', '10.png', '11.png', '12.png', '13.png', '14.png', '15.png', '16.png', '17.png', '18.png', '19.png', '20.png', '21.png', '22.png', '23.png', '24.png', '25.png', '26.png', '27.png', '28.png', '29.png', '30.png', '31.png', '32.png', '33.png', '34.png', '35.png', '36.png', '37.png', '38.png', '39.png', '40.png', '41.png', '42.png', '43.png', '44.png', '45.png', '46.png', 'secret.png'] wave_img_path = "C:/Users/Home/Downloads/imgonline-com-ua-Resize-jjS2xs50sS04g.png" # 提前打开波浪图,避免循环内重复IO操作 wave = Image.open(wave_img_path).convert("RGBA") wave_number = 0 for bodyColor in bodyColor_list: wave_number += 1 # 打开背景图并转为RGBA模式,确保支持透明叠加 img = Image.open(bodyColorListDir + bodyColor).convert("RGBA") # 将波浪图粘贴到背景图的(1000,1000)位置,用波浪图自身作为遮罩实现透明效果 img.paste(wave, (1000, 1000), mask=wave) # 保存叠加后的图片 img.save(f'C:/Users/Home/Documents/neutral-cubes/tempes/wave{wave_number}.png')
关键细节说明
convert("RGBA"):确保两张图片都带有alpha透明通道,否则透明叠加无法生效;如果背景图原本是RGB模式,转换后不会破坏原有纯色内容。img.paste(wave, (1000, 1000), mask=wave):第三个参数mask=wave是实现透明叠加的核心,它会让波浪图的透明区域(alpha值为0的部分)不覆盖背景,仅显示非透明的波浪图案。- 波浪图提前打开:循环内重复打开图片会增加磁盘IO开销,放在循环外仅加载一次能提升运行效率。
内容的提问来源于stack exchange,提问作者KirOFF
相关产品推荐
相关产品推荐

