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
相关产品推荐
相关产品推荐

