如何使用Python将ICO图标转换为PNG并正确提取不同尺寸版本?
问题核心原因
直接修改Image对象的size属性无法切换ICO文件内置的多尺寸帧,PIL默认打开ICO时仅加载最大分辨率的图标帧,手动调整size只是对该最大尺寸图片做缩放,不会读取内置的其他独立尺寸资源。
运行前请确保Pillow版本≥9.1.0,旧版本对ICO多帧读取的支持存在缺陷,可执行pip install --upgrade pillow升级
修正后可运行代码
import os from PIL import Image # 自动创建输出目录,避免路径不存在报错 os.makedirs('png', exist_ok=True) directory = r'../Icons/ico' for filename in os.listdir(directory): if not filename.endswith(".ico"): continue ico_full_path = os.path.join(directory, filename) print(f"正在处理:{ico_full_path}") with Image.open(ico_full_path) as ico_file: # 遍历ICO包含的所有独立尺寸帧 for frame_index in range(ico_file.n_frames): # 切换到对应尺寸的帧 ico_file.seek(frame_index) width, height = ico_file.size size_tag = f"{width}x{height}" # 构造输出文件名,rstrip避免文件名本身带i/c/o字符被误删 output_filename = f"{filename.rstrip('.ico')}_{size_tag}.png" ico_file.save(os.path.join('png', output_filename)) print(f"导出完成:{output_filename},尺寸{size_tag}")
关键优化点
- 用
n_frames属性获取ICO内封装的独立图标总数 - 用
seek()方法切换到对应图标帧,直接读取原始尺寸的像素数据,无缩放损耗 - 新增输出目录自动创建逻辑,无需手动提前建文件夹
- 优化文件名截取逻辑,避免文件名本身包含i、c、o字符时被错误删除
- 用上下文管理器自动管理文件资源,降低内存泄漏概率
内容的提问来源于stack exchange,提问作者Kristina K
相关产品推荐
相关产品推荐

