Pillow ICO 保存时尺寸被自动缩放?原因与解决方案-Python教程

pillow 的 `save(…, format=’ico’, sizes=…)` 并未忽略你指定的尺寸,而是根据输入图像的宽高比**自动等比缩放**生成图标,导致输出尺寸与预期不符(如 `(16, 16)` 变为 `(16, 15)`)。根本原因是 ico 格式要求每个图标的宽高必须严格匹配原始图像的纵横比——非方形源图将导致所有尺寸按比例压缩。

在 Windows 平台生成标准 .ico 文件时,Pillow 的 ICO 保存器会忠实遵循图标规范:所有嵌入的图标尺寸必须保持与源图像完全一致的宽高比。这意味着:如果你传入一张 256×244 的 PNG(宽高比 ≈ 1.049),那么即使你显式指定 sizes=[(16,16), (32,32), …],Pillow 也会将每个目标尺寸按 244/256 ≈ 0.953 的比例缩放高度,最终生成 (16,15), (32,30), (256,244) 等尺寸——这正是你在 check.info[‘sizes’] 中看到的结果。

✅ 正确做法是:确保输入图像为严格正方形(如 256×256)。Pillow 会据此生成完全匹配你声明尺寸的图标组:

from PIL import Image
from io import BytesIO

# ✅ 关键:使用正方形源图(或主动转换为正方形)
source = Image.open("input.png").convert("RGBA")
# 方案1:裁剪为中心正方形
w, h = source.size
min_dim = min(w, h)
left = (w - min_dim) // 2
top = (h - min_dim) // 2
square_img = source.crop((left, top, left + min_dim, top + min_dim))

# 方案2:填充为正方形(推荐,保留全部内容)
background = Image.new('RGBA', (min_dim, min_dim), (0, 0, 0, 0))
x = (min_dim - w) // 2
y = (min_dim - h) // 2
background.paste(source, (x, y))
square_img = background

# 指定目标尺寸(全部为正方形)
icon_sizes = [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64),
              (96, 96), (128, 128), (192, 192), (256, 256)]

# 保存 ICO —— 此时 sizes 将被精确应用
with BytesIO() as output:
    square_img.save(output, format='ICO', sizes=icon_sizes, bitmap_format="bmp")
    ico_data = output.getvalue()

# 验证:用 Pillow 重新打开可查看实际嵌入尺寸
with Image.open(BytesIO(ico_data)) as ico:
    print("实际嵌入尺寸:", ico.info.get('sizes', set()))
# 输出: {(16, 16), (24, 24), (32, 32), ..., (256, 256)}

⚠️ 注意事项:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Pillow ICO 保存时尺寸被自动缩放?原因与解决方案-Python教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4032193+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4032193+
  • 本周更新: 0+
  • 最后更新: 2026-03-16