如何解决PIL裁剪的圆形透明图片粘贴到白色背景变成方形的问题
问题原因
你在调用PIL的paste方法时没有指定透明蒙版,PIL默认会忽略PNG图片的alpha通道,将所有像素直接覆盖到背景上,原本透明的区域也会被填充,最终呈现方形效果。
解决方法
只需在粘贴时额外传入mask参数,使用圆形图片自身的alpha通道作为蒙版即可:
# 将原有paste逻辑替换为以下代码 circle_img = Image.open('result.png') # 第二个参数只需指定左上角坐标即可,无需传入完整边界 background.paste(circle_img, (200, 200), mask=circle_img)
优化方案(可选)
你可以省略中间临时文件result.png的存储步骤,直接在内存中完成所有处理,减少磁盘IO开销,完整可运行代码如下:
from PIL import Image, ImageDraw import numpy as np pfp = Image.open(avatar) # 裁剪为圆形 img = pfp.convert("RGB") h, w = img.size # 生成alpha通道 alpha = Image.new('L', img.size, 0) draw = ImageDraw.Draw(alpha) draw.pieslice([0, 0, h, w], 0, 360, fill=255) # 直接合并生成带透明通道的圆形图片 circle_img = Image.merge("RGBA", (*img.split(), alpha)) # 读取背景并粘贴 background = Image.open('white2.png') background.paste(circle_img, (200, 200), mask=circle_img) background.save('combined.png')
内容的提问来源于stack exchange,提问作者CatsRdeBest2018
相关产品推荐
相关产品推荐

