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

Python PIL粘贴图片时如何等比例缩放icon适配背景空白区域

PIL缩放图标适配背景空白区粘贴实现方法

核心修改逻辑

你原有代码未对尺寸偏大的icon做缩放处理,直接粘贴会超出空白区域。只需要在生成遮罩前增加icon等比例缩放步骤,同时将遮罩尺寸和缩放后的icon尺寸对齐即可,全程不会出现图标变形、遮罩错位的问题。
操作前先提前测量背景图中预留空白框的3个参数:

  • 空白框的宽度target_w
  • 空白框的高度target_h
  • 空白框左上角在背景图中的坐标(paste_x, paste_y)(你原有代码中写的(200, 100)就是这个坐标值,替换为实际测量值即可)

完整修改后代码

from PIL import Image, ImageDraw

# 读取素材
icon = Image.open("./icon.png")
background = Image.open("./background.png")

# ========== 替换为你实际测量得到的空白框参数 ==========
target_w = 180  # 空白框宽度
target_h = 180  # 空白框高度
paste_x = 200   # 空白框左上角X坐标
paste_y = 100   # 空白框左上角Y坐标
# ======================================================

# 等比例缩放icon,保证完全适配空白框不变形
icon_w, icon_h = icon.size
scale_ratio = min(target_w / icon_w, target_h / icon_h)
resized_icon_size = (int(icon_w * scale_ratio), int(icon_h * scale_ratio))
# 用LANCZOS算法缩放,图标画质损失最小
# 若使用老版本PIL,把Image.Resampling.LANCZOS替换为Image.LANCZOS即可
icon_resized = icon.resize(resized_icon_size, Image.Resampling.LANCZOS)

# 基于缩放后的icon尺寸生成圆形遮罩
mask = Image.new("L", resized_icon_size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0) + resized_icon_size, fill=255)

# 粘贴到背景,下方坐标默认让icon在空白框内居中,不需要居中可直接传入(paste_x, paste_y)
back_im = background.copy()
center_paste_x = paste_x + (target_w - resized_icon_size[0]) // 2
center_paste_y = paste_y + (target_h - resized_icon_size[1]) // 2
back_im.paste(icon_resized, (center_paste_x, center_paste_y), mask=mask)

# 导出结果
back_im.save("./back_im.png")

注意事项

  • 缩放必须在生成圆形遮罩之前完成,否则会出现遮罩和图标尺寸不匹配、显示错位的问题
  • 等比例缩放取宽高缩放比的最小值,能保证图标不会被拉伸变形,也不会超出空白框范围
  • 如果icon本身带透明通道,不需要额外处理,缩放和粘贴时会自动保留透明效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:48:43