You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:39:54