清除元数据而不损失画质:为什么重新编码不等于清理
清除照片的元数据有两种方式。一种是把数据块取出来,图像保持原样。另一种是打开照片,重新画一遍,再重新保存:元数据在这个过程中丢掉了,但图像也变了。而有时候,元数据甚至都没有丢掉。
什么是重新编码
JPEG 或 HEIC 用有损压缩来存储图像:保存时会丢弃眼睛几乎察觉不到的信息。如果有人打开照片再保存一次,这种压缩就会在前一次的基础上再施加一次,图像又损失一点。一次很难看出来;多次之后,就会出现色块、边缘发脏、颜色褪淡。
很多工具正是这样清除元数据的,因为这最容易编程:把照片画到画布上,再导出一次。这样可行,但不是没有代价。
我们测到了什么
我们拿一张带 GPS 的 3024 × 4032 测试照片,用三种方式处理。百分比因照片而异——细节多的照片比我们这张平滑的损失更多——所以重要的是什么变了、什么没变:
- 在浏览器里重新绘制,许多简单网站都是这么做的:1.8% 的像素变了,文件从 925 kB 变成了 742 kB。它清除了 GPS,但重新编码了。
- 用 macOS 的图像工具重新保存(
sips),质量 85:16.8% 的像素变了,而且 GPS 还在。重新编码不等于清理。 - 用 KillEXIF:一个像素都没变。图像数据逐字节相同,GPS 已经没有了。
- 以质量 90 连续保存十次:每保存一次,与原件的差异就更大一些。这就是不重新编码之所以重要的原因:照片每经过一次这样的工具,就又损失一点。
如何判断一个工具是否重新编码
有些线索不用测量就能看出来:
- 大小变化很大。 清除元数据只会省下几 KB,如果有缩略图会多一点。如果一张 3 MB 的照片出来变成了 2 MB,那它被重新压缩过了。
- 保存时让你选「质量」。 有质量,就有压缩。
- 格式变了:如果放进去的是 HEIC,出来的是 JPEG,整张图像都重新编码过了。
- 耗时和处理图像一样长:删除一个元数据块几乎是瞬间的事;重新压缩一张大照片则不然。
KillEXIF 怎么做
KillEXIF 清除元数据而不碰图像:它在文件里找到数据块,把它们取出来,其余部分原样复制。然后它会重新读取清理后的文件,确认该去掉的已经去掉,并告诉你:「已验证:没有敏感信息残留」。如果有什么东西去掉就会弄坏文件,它会说明情况,而不是重新压缩。
所以清理后的照片和原件大小几乎相同,你想清理多少次都行,它不会损失任何东西。视频也一样:元数据去掉了,视频不会被重新编码。