为何用PIL保存的图片MD5值与原图不同?保存后是否为原图?
为什么用PIL保存的JPG图片MD5值和原文件不同?保存后的图和原图等价吗?
哈哈,这个问题我碰到过好多次了,给你掰扯清楚:
为啥MD5不一样?
主要有这几个核心原因:
- JPEG是有损压缩格式:哪怕你啥编辑都没做,用PIL打开再保存JPG时,它都会重新执行一遍JPEG压缩流程,而且用的是PIL默认的压缩参数(比如默认质量是75)。原图片的压缩参数(比如拍摄时的质量设置、编码算法细节)和PIL的默认参数大概率不一样,生成的二进制文件自然就有差异,MD5值肯定变了。
- 元数据发生变化:原图片可能带着EXIF信息(比如拍摄时间、相机型号)、ICC色彩配置文件这些额外数据,PIL在保存的时候,可能会修改、甚至直接移除这些元数据,或者用自己的格式重新写入,这也会改变文件的二进制内容,MD5当然就不同了。
- 编码实现存在差异:不同工具对JPEG的编码细节处理不一样,比如原图片可能是相机自带软件、Photoshop生成的,而PIL用的是自己的编码逻辑,哪怕压缩参数差不多,最终的二进制文件也会有细微差别。
保存后的图片和原图等价吗?
得分情况来看:
- 从视觉效果来说:如果原图质量本身不错,用PIL默认参数保存的话,视觉上基本看不出区别;但如果原图已经是经过多次压缩的低质量图,二次压缩可能会出现肉眼可见的模糊、色块。
- 从数据层面来说:它们的二进制内容完全不一样,所以严格来说不是同一个文件。但如果你的使用场景只在乎图片的视觉内容,那绝大多数情况下可以认为是等价的。
小Tips
要是想尽量减少差异,保存的时候可以指定更高的质量参数,比如:
im.save('pic1.jpg', 'jpeg', quality=95)
如果要完完全全保留原文件的二进制内容,别用PIL打开再保存,直接用文件复制就行,比如Python里的shutil.copyfile:
import shutil shutil.copyfile('pic.jpg', 'pic1.jpg')
内容的提问来源于stack exchange,提问作者coin cheung
相关产品推荐
相关产品推荐

