pil.image.save() 默认丢exif但新版pillow可能残留,应显式清空info或用exif=b"";exiftool最彻底,需防备份爆盘;piexif可精准删字段但不支持webp/heic;中文路径需utf-8编码处理。

用 PIL.Image 保存时默认不保留 EXIF,但有陷阱
直接用 PIL.Image.open().save() 确实会丢掉大部分 EXIF,但某些版本(尤其是 Pillow ≥ 9.1.0)在 JPEG 上可能残留 Exif 或 XMP 数据,尤其当原图含缩略图或自定义标签时。这不是 bug,而是 Pillow 默认复用原始 info 字典中的部分字段。
实操建议:
- 显式清空
image.info中的"exif"、"xmp"、"icc_profile"键(如果存在) - 对 JPEG 图片,用
save(..., exif=b"")强制覆盖空 EXIF blob - 避免依赖
copy()—— 它会浅拷贝info,EXIF 仍可能残留
exiftool 命令行更彻底,适合批量处理非 Python 环境
Python 脚本调用 exiftool 是最稳妥的方案,它由专业元数据工具维护,能清除所有标准 + 非标字段(如 MakerNote、GPS、版权字符串),且支持就地擦除或输出新文件。
常见错误现象:直接运行 exiftool -all= *.jpg 会生成备份文件(*_original),线上脚本容易爆磁盘。
实操建议:
- 加
-overwrite_original关闭备份(慎用,确保有源文件副本) - 用
-quiet和-ignore抑制无关输出,方便脚本捕获结果 - Windows 下注意路径空格,建议用
subprocess.run([...], shell=False)并传入列表 - 示例命令:
exiftool -all= -overwrite_original -quiet -ignore "ThumbnailImage" *.jpg
Python 中用 piexif 精准删除特定字段,避免误删 ICC
如果只需清除 GPS、相机型号等敏感字段,而想保留色彩配置(ICC profile)或缩略图(不影响隐私),piexif 比全删更可控。但它不支持 WebP、HEIC,且对 JPEG 的 APP1/APP2 段解析较底层。
性能影响:加载+解析+重建 EXIF 比纯二进制擦除慢 3–5 倍,千张图明显可感。
实操建议:
- 先用
piexif.load(image_path)检查是否存在"GPS"或"0th"中的271(Make)、272(Model)字段 - 删除时用
del exif_dict["GPS"]和del exif_dict["0th"][271]等,再调用piexif.insert(...) - 别直接传空字典给
insert—— 这会抹掉整个 EXIF 区,包括 ICC
Windows 上中文路径 + 批量递归处理的兼容要点
用 glob 或 pathlib.Path.rglob() 遇到中文路径时通常没问题,但 exiftool 在旧版 Windows 控制台(CMD)下可能因编码报错,表现为 "UnicodeEncodeError: 'charmap' codec can't encode character"。
容易被忽略的地方:
- Python 脚本开头加
sys.stdout.reconfigure(encoding='utf-8')(仅 Py3.7+) - 调用
exiftool时显式指定encoding='utf-8'参数(subprocess.run(..., encoding='utf-8')) - 路径传给
exiftool前,用str(p.absolute())转成绝对路径,避免相对路径在子目录中失效 - 别用
os.system()—— 它无法可靠捕获中文错误信息
exiftool 会跳过但不报错;又比如 HEIC 文件在 Linux 上需额外安装 libheif 支持。这些边界情况比“怎么删”本身更消耗调试时间。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











