使用Pillow将PNG粘贴到另一PNG时不覆盖背景图像的实现问题
你遇到的问题是PIL的paste方法默认行为是直接用源图的像素完全覆盖目标图对应位置的像素,包括alpha通道。你粘贴的源图im2对应位置的alpha值为0,覆盖后目标图的对应区域alpha也被改为0,因此出现了透明块。
解决方案
只需在调用paste方法时传入mask参数,将待粘贴的透明图本身作为蒙版即可,该模式下会自动跳过源图中完全透明的区域,仅保留不透明/半透明区域的混合效果,完全透明的区域会直接保留背景图的原有像素。
修改后的代码示例:
from PIL import Image im2 = Image.new("RGBA", (100,100), (0,0,0,0)) im3 = Image.open(r".\test.png") # 新增mask参数,值为待粘贴的图像本身 im3.paste(im2, (0, 0), mask=im2) im3.save(r".\test.png")
如果你的需求是粘贴时仅保留源图的不透明内容,不需要半透明混合效果,也可以提前将源图的透明部分裁剪掉再粘贴,效果一致。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

