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

使用PIL为PNG头像添加圆形遮罩时背景不透明问题求助

解决圆形头像遮罩后背景不透明的问题

你的代码主要有两处问题导致背景无法呈现透明效果:一是未对原图做居中正方形裁剪,直接截取左上角区域会让非正方形原图的有效内容偏移;二是圆形遮罩的半径与轮廓设置冲突,导致遮罩边缘出现超出画布或半透明的异常情况。

修改后的代码如下:

import urllib.request
from PIL import Image, ImageDraw

def crop_image(url):
    img = Image.open(urllib.request.urlopen(url))
    img = img.convert("RGBA")
    
    # 居中裁剪为正方形,保证头像完整居中
    width, height = img.size
    crop_size = min(width, height)
    left = (width - crop_size) // 2
    top = (height - crop_size) // 2
    img = img.crop((left, top, left + crop_size, top + crop_size))
    size = img.size
    
    # 创建适配画布的圆形遮罩:轮廓宽度纳入半径计算,避免超出范围
    mask = Image.new('L', size, 0)
    draw = ImageDraw.Draw(mask)
    outline_width = 5
    radius = (size[0] // 2) - (outline_width // 2)
    # 填充白色为不透明区域,轮廓同步使用白色(无需轮廓可删除outline、width参数)
    draw.circle((size[0]//2, size[1]//2), radius=radius, fill=255, outline=255, width=outline_width)
    
    # 应用遮罩并保存
    img.putalpha(mask)
    img.save(r"C:\Users\petersk\Desktop\output.png", format="PNG")
    
    return img

url = "https://static.www.nfl.com/image/private/t_person_squared_mobile/f_auto/league/icjfdfsncqlsqe49iujv"
crop_image(url)

关键修改点说明:

  • 居中裁剪:通过计算原图中心坐标,裁剪出正方形区域,避免无效区域干扰,保证头像显示完整且居中。
  • 遮罩半径适配:减去轮廓宽度的一半,确保轮廓完全在遮罩画布内,避免边缘被截断导致的透明异常。
  • 颜色值标准化:直接使用数值255(对应白色)替代字符串参数,减少解析误差,确保遮罩区域完全不透明。

调整后保存的PNG图片将具备透明背景,仅圆形区域显示头像内容。

内容的提问来源于stack exchange,提问作者Peter Skeels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:07:16