如何为PIL库的paste方法制作符合要求的遮罩?
问题原因
你的代码存在两个核心错误:
- 没有保证遮罩素材和待处理图片的尺寸一致,尺寸不匹配会导致蒙版错位/失效
- 处理RGBA格式遮罩时错误地将所有像素的alpha通道设为255,PIL使用RGBA图作为paste方法的mask参数时,仅读取alpha通道作为透明度依据,全255的alpha等于蒙版完全不生效
正确实现代码
推荐直接替换原图alpha通道的方案,逻辑更简单不易出错:
from PIL import Image # 打开原图转RGBA模式 img = Image.open("image.jpg").convert("RGBA") # 打开遮罩:先缩放到和原图同尺寸,再转单通道灰度模式 mask = Image.open("images/mask_card.png").resize((img.width, img.height)).convert("L") # 直接将遮罩灰度值作为原图的alpha通道:白色区域不透明,黑色区域透明 img.putalpha(mask) img.show() # 若要保留透明背景保存,使用png格式即可 # img.save("处理后图片.png")
如果需要沿用你原来的paste写法,调整后代码如下:
from PIL import Image img = Image.open("image.jpg") mask = Image.open("images/mask_card.png").resize((img.width, img.height)).convert("L") essai = Image.new('RGBA', (img.width, img.height)) essai.paste(img, (0, 0), mask=mask) essai.show()
补充说明
如果出现蒙版效果和预期相反的情况(比如你要保留的区域变透明,要去掉的边角反而显示),可以在转灰度后对遮罩做反色处理:
mask = Image.eval(mask, lambda x: 255 - x)
内容的提问来源于stack exchange,提问作者Netchaiev
相关产品推荐
相关产品推荐

