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

