如何使用Pillow生成完全相同的图像副本?保存后哈希不一致问题
为什么PIL保存JPG时用
quality="keep"仍无法保持图像数据一致? 这问题我之前踩过坑,其实核心原因在于JPG格式的特性和PIL对quality="keep"的实际处理逻辑,咱们拆开来聊:
JPG是有损压缩格式,打开再保存等于重新编码
当你用Image.open()打开一张JPG时,PIL已经把它解码成了内存中的像素数组——这一步已经是有损解码后的结果,不是原始的JPG编码字节。哪怕你设置quality="keep"保存,PIL也会基于解码后的像素重新进行JPG编码,而不是直接复制原始文件的编码数据。重新编码过程中,哪怕用了和原始文件相同的质量参数,编码器的细微实现差异、量化表的计算偏差等,都会导致最终的图像数据和原始文件不一样,哈希值自然无法匹配。quality="keep"的真实含义不是“保留原始字节”
你可能误以为这个参数是让PIL直接复用原始JPG的编码内容,但实际上它的作用是:读取原始JPG文件中记录的质量参数,然后用这个参数来编码新文件。简单说,它是“复用质量设置”,不是“复用原始编码数据”,所以重新编码后的文件必然和原始文件存在差异。元数据和文件结构的额外差异
除了图像像素,JPG文件还包含EXIF等元数据。保存时PIL可能会重新整理元数据的存储格式,甚至添加一些自身的标记信息,这些都会改变文件的整体字节内容,进一步导致哈希值不匹配。
想要完全复制文件的解决方案
如果你的需求是得到和原始文件字节完全一致的副本,不要用PIL处理,直接用文件复制工具:
import shutil shutil.copyfile("/tmp/original.jpg", "/tmp/new.jpg")
这样复制的是原始文件的完整字节流,哈希值就能完全匹配了。
内容的提问来源于stack exchange,提问作者Daniel Quinn
相关产品推荐
相关产品推荐

