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

使用Python Pillow保存的图片为何比原文件体积小?

问题分析与解决方案

嘿,这个问题其实挺常见的,我来帮你拆解一下~

你遇到的情况是用Pillow打开PNG再直接保存后,文件大小减半但分辨率和位深没变化,核心原因大概率和元数据保留以及PNG压缩参数有关,咱们一步步来:

1. 元数据丢失是头号嫌疑

从你提到的EXIF对比差异来看,原图片大概率包含了Pillow默认保存时不会自动保留的额外元数据,比如:

  • ICC颜色配置文件(很多专业图片会带这个,占用不小的体积)
  • 完整的EXIF拍摄信息、设备参数
  • XMP元数据、图片注释或者自定义标签
  • PNG文件里的tEXt/zTXt/iTXt块

Pillow在打开图片时,只会读取部分核心元数据,默认保存时并不会把所有原始元数据都写入新文件,这就会导致文件体积明显变小。

解决办法:手动保留元数据

你可以尝试提取原图片的info字典,保存时传入这个参数,让Pillow尽量保留原始元数据:

from PIL import Image

imageone = Image.open("/Users/Michael/Desktop/test1.png")
# 提取原始图片的元数据信息
original_info = imageone.info
# 保存时传入info参数,尽可能保留元数据
imageone.save("/Users/Michael/Desktop/test2.png", **original_info)

注意:不是所有元数据都能被Pillow完美保留,比如一些非常见的自定义标签可能还是会丢失,但大部分核心元数据(比如ICC profile)会被保留。

2. PNG压缩级别差异

PNG是无损压缩格式,压缩级别(0-9,0无压缩,9最高压缩)直接影响文件大小。Pillow保存PNG时默认的压缩级别是6,而你的原文件可能用了更低的压缩级别(比如0或1),这就会导致新文件因为压缩更充分而体积变小。

验证与解决办法

你可以先查看原图片的压缩级别:

print(imageone.info.get("compress_level"))

如果原级别和默认的6不同,保存时指定相同的压缩级别即可:

# 假设原文件压缩级别是2
imageone.save("/Users/Michael/Desktop/test2.png", compress_level=2)

3. PNG过滤器或压缩算法差异

不同工具保存PNG时可能使用不同的行过滤器(PNG有5种过滤器),或者不同版本的zlib压缩库,这也会导致相同图片的压缩体积有差异。Pillow使用的zlib版本如果比原文件保存工具的更高效,也会让新文件更小。

这个情况一般不需要特殊处理,除非你必须和原文件的压缩方式完全一致,那可能需要更深入的PNG底层处理了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:43:16