勾了「全部清除」,产物里还剩 553 字节元数据
准备发出去的几张旅行照,我用默认那一档挨个跑了一遍元数据,页面提示省下几千字节。让我停下来的是顺手做的事:把产物再拖回页面读一遍。这一读,ev_exif.jpg 从 7746 字节变 4711 字节、少 3035,EXIF 标签确实归零,内嵌缩略图 0B,XMP 也没了,可元数据合计只从 3588 降到 553。
那 553 拆得开:0xE2 的 ICC 段带 2 字节段头记 447,0xED 的 PSD 段记 106,相加正好 553;16 字节的 0xE0 JFIF 段原样留着,只是没进这个合计。原因也不神秘:默认档的 5 个复选框只勾了 XMP 与 JPEG 注释,Photoshop 图像数据与色彩配置 ICC 都空着,砍的是被勾中的那几段。
后来我改成一件很笨但有用的事:图片EXIF查看与清除跑完拿到产物,就把它再拖回去读一遍。工具不会替我做这步,只回一句省了多少字节,那 553 是我自己重读看到的。
「只去掉位置信息」不是砍段,而是按结构重写
换到第二档,同一张源图从 7746 变 6945 字节、只少 801。页面提示写的是省下 237 B,对不上不是算错:237 只统计被删的位置标签,这一档还会把含位置的 XMP 段整段摘走,那段 562 加 2 字节段头是 564,237 加 564 正好 801。
产物再拖回去读,残留 38 条标签,而源图本来就是 4 组 48 条(ifd0 12、exif 24、gps 10、interop 2)。机身序列号 X100-0012345、镜头序列号 L-987654、96 字节的厂商注释、用户注释、作者、版权全部在,消失的只有 GPS 那 10 条。删不删跟有没有隐私标记无关:48 条里只有 9 条打了 [privacy],GPS 那 10 条反倒不打标记,只在组头挂一句位置信息最敏感建议清除。
图 1|同一张 ev_exif.jpg 现算两次:默认档砍 3 个连续区间剩 4711,元数据仍 553;位置档只重写结构,少掉的 801 里位置标签占 237。
内嵌缩略图会不会被一起去掉,看两件事
面板那行「EXIF 内嵌缩略图 · 清除 EXIF 会一起去掉」只对默认档成立。能不能切出来有硬条件:0x0201 与 0x0202 同时存在,且 0x0103 的压缩方式等于 6。ev_exif.jpg、ev_exif.png、ev_exif.webp 三个样本都切出 1125 字节、文件头 FF D8 FF E0;ev_nothumb.jpg 照样有 48 条标签,缩略图却是 0B,APP1 只剩 1198 字节,比 ev_exif.jpg 的 2347 少 1149,正好是 1125 加描述它的 2 条 IFD 条目各 12 字节。
位置档跑完,1125 字节仍在:它跟经纬度住在同一个 APP1 里,却不属于位置字段,重写时被原样搬过去。
PNG 与 WebP 走砍块:像素没动,产物却对不上纯删除
默认路径不会重压一遍画质,几个容器都能对齐。ev_exif.png 从 4976 变 1888、少 3088,1729 字节的 IDAT 逐字节相同;重读剩下的块是 IHDR、pHYs、pHYs、gAMA、iCCP、IDAT、IEND,文本块从 3 条清零,元数据从 3148 掉到 60。带透明的 ev_alpha_exif.png 1439 → 207 之后 colorType 仍是 6、hasAlpha 仍是 true。
WebP 多改一处:块表从 VP8、EXIF、XMP、ICCP 变成 VP8、ICCP,2168 字节的 VP8 负载逐字节相同,但产物跟纯删除对不齐,首个失配落在偏移 4 的 RIFF 长度字段上。ev_alpha_exif.webp 1996 → 356 后 VP8X、ALPH、VP8 三块齐全,ALPH 那 48 字节没被动,可重读时 hasAlpha 仍报 false。
| 样本 | 源文件 | 默认档产物 | 位置档产物 | 重读残留 |
|---|---|---|---|---|
ev_exif.jpg | 7746B | 4711B | 6945B | 元数据 553B/38 条标签 |
ev_exif.png | 4976B | 1888B | 4161B | 60B,IDAT 1729B 未动 |
ev_exif.webp | 5262B | 2376B | 4486B | ICCP 188B 原样留着 |
ev_anim.gif | 1396B | 1023B | 未测 | 像素区 971B 未动 |
ev_exif.tif | 58886B | 无产物 | 无产物 | 一句该格式暂不支持无损清除 |
图 2|同一档跑完留下的东西差很多:JPEG 是 ICC 段 447 加 PSD 段 106,WebP 剩 ICCP 188,PNG 只剩 60,GIF 的注释块 41 与 XMP 块 332 全砍。
同一串坐标有四种写法,标签名还会串位
清之前得先确认读到的是不是位置。摘要行是 31.247667, 121.479133;地图链接直接把原始 double 拼进 URL,#map=16/31.247666666666667/121.47913333333334;度分秒只留秒的 2 位,31°14'51.6" 121°28'44.88";海拔在摘要行是 52.6375,在同一份标签表里成了 52.638;越界警告又是 5 位小数「纬度 199.24767」。一个值四种精度。
更误导的是标签名按 id 全局共用、不分子目录,于是 interop 组被按 GPS 的名字渲染成 0x1 北纬/南纬 = R98 与 0x2 纬度 = 276,真身却是 InteroperabilityIndex 与 InteroperabilityVersion,四个容器都复现。
Q:怎么确认产物真清干净了?
把产物再拖回去读一次。清除阶段不会自己复检,只给一句省了多少字节;位置档跑完再跑一遍,字节仍是 6945 且逐字节相同,第二遍只回一句没有需要清除的内容。
Q:想留参数又想拿掉身份字段,怎么选?
位置档不动机身序列号、镜头序列号 L-987654、96 字节厂商注释、作者与版权,却会把含位置的 XMP 整段摘走;默认档反过来,EXIF 清零但留下没勾的 ICC 与 PSD 共 553 字节。
Q:拖进去没反应,是后缀的问题吗?
只看文件头魔数,后缀与 MIME 都不参与——ev_jpg_named.png 7746 字节被按 JPEG 处理,下载又保留原扩展名,产物是个挂着 .png 的 JPEG 流。TIFF 两种模式都被拒、不产出字节,HEIC 只探盒;超过 40MB 的进不了列表,41951810 字节只超 7470 也被跳过,末尾只汇总一句。