起因:一张猫的照片吐出了 187 行
上周三下午,朋友在群里发了张猫的照片,配文「随便拍的别嫌弃」。我存下来顺手拖进 exiftool,终端刷了大概两秒,出来 187 行。机型 iPhone 15 Pro,拍摄时间 2024-03-17 14:22:06 +08:00,焦距 6.765mm,等效 24mm,F1.78,ISO 64,快门 1/120。再往下,纬度 31.2304xx,经度 121.4737xx,海拔 12.3 米,还有一行 GPSHPositioningError,写着 8 米。
8 米什么概念?那坐标直接落在她家小区里,误差范围内楼栋都能对得上。我把截图发回去,她沉默了十来秒,问我怎么删。
这事儿之后我陆续把手上四台设备——一台 iPhone、两台安卓、一台老微单——和六个常用 App 的图片信息全扒了一遍。越扒越觉得,大多数人对「图片信息」的理解停在「这图拍的是啥」,而一个 JPEG 文件里躺着的东西比你看见的多得多,并且它们分属完全不同的层,各有各的脾气,删错一层,要么泄露,要么颜色全毁。
第一层和第二层:像素是皮,EXIF 是骨
JPEG 不是一整块数据,它是一串「段」拼起来的。文件开头两个字节 FFD8 是 SOI,之后每个段都是 FF 加一个标记字节加两字节长度。APP0 塞 JFIF,APP1 放 EXIF 或者 XMP,APP2 是 ICC 色彩配置文件,APP13 归 Photoshop 和 IPTC,APP14 是 Adobe 自己留的位。
关键在于每个段的长度字段只有 2 字节,也就是说单个段最大 65535 减去 2,65533 字节,超了就塞不下。现在的手机特别爱往 APP1 里灌东西,缩略图、面部区域、厂商私有 MakerNote,动不动就上万字节。我手上有一台安卓机拍的样张,XMP 部分撑到 40 多 KB,结果 EXIF 里的 GPSLatitude 是空的,位置信息全被挤到 XMP 那边去了。
这就引出一个绝大多数教程都不提的坑:你只删 EXIF 的 GPS,位置未必真删干净。 因为 XMP 命名空间里也有一套 GPSLatitude、GPSLongitude、GPSAltitude。很多「一键清除 EXIF」的在线工具只处理 APP1 里的 EXIF IFD,XMP 那块原封不动。想验证很简单,清完之后再跑一遍 exiftool -a -G1 -s 你的图.jpg,看有没有 XMP-exif 开头的字段。
第三层:XMP,Adobe 塞进来的那个大背包
2001 年 Adobe 推出 XMP,本质是一段塞进图片里的 RDF/XML。它能装的东西比 EXIF 宽得多:关键词、星级评分、人脸标注区域、历史编辑记录、(这里我本来想写「以及版权」就带过,但实际远不止)还有 Lightroom 那套调色参数。
Lightroom Classic 导出 JPEG 时,如果把元数据选项设成「全部」,XMP 里会带上一整串 crs: 前缀的字段——crs:Exposure2012、crs:Contrast2012、crs:Temperature、crs:Shadows2012、crs:Highlights2012、crs:Clarity2012、crs:Vibrance……基础面板上你拉过的每一根滑杆,基本都能在 XMP 里找到对应数值。
我不知道别人怎么想,反正我第一次发现这件事的时候有点被冒犯:把原片发给客户,等于把调色配方一起发了。同行花五分钟就能知道你加了 -38 的高光、+12 的清晰度。所以我自己导出交付版时,元数据一律选「仅版权」,crs 那堆东西直接不写。
顺便给个对照,这几套元数据的边界经常被混着说:
| 标准 | 诞生年份 | 典型载体 | 主要装什么 | 平台读取情况 |
|---|---|---|---|---|
| EXIF | 1995 | JPEG APP1 / HEIC item | 拍摄参数、时间、GPS | 大部分平台读得到 |
| IPTC IIM | 1979 | JPEG APP13(Photoshop) | 标题、作者、版权 | 老门户、图库还在用 |
| XMP | 2001 | JPEG APP1(与 EXIF 抢位) | 编辑历史、评分、调色参数 | 阅读器多,平台基本忽略 |
| ICC Profile | 1993 | JPEG APP2 | 色彩空间定义 | 浏览器和系统会用 |
| C2PA | 2021 | JPEG APP11(JUMBF) | 来源签名、AI 生成标记 | 2024 年后才慢慢铺开 |
第四层:ICC,颜色到底对不对全看这一层
这层最容易被忽略,也最容易出事故。iPhone 默认用 Display P3 拍,色域面积大概覆盖 CIE 1931 的 45% 上下,而 sRGB 只有 35% 左右,Adobe RGB 约 50%。如果你用 -all= 一把梭把所有元数据删了,ICC 也跟着没了,浏览器只能按 sRGB 猜——原本鲜艳的红色会被压得发闷,绿色偏黄,这正是很多人说的「传上网颜色变灰了」。
所以正确做法是清元数据时把 ICC 保留下来。exiftool 有个经典写法:
# 全清 EXIF/XMP/IPTC/GPS,但把 ICC 拷回来
exiftool -all= -tagsfromfile @ -icc_profile -overwrite_original *.jpg
如果你用 ImageMagick 的 mogrify -strip,注意它是连 ICC 一起剥的,用完记得手动 emb 回去:magick input.jpg -profile sRGB.icc output.jpg。
第五层:C2PA,2023 年之后才冒出来的新东西
2021 年 2 月,Adobe、微软、BBC、Arm、Intel、Truepic 几家凑在一起搞了个 C2PA,全称 Coalition for Content Provenance and Authenticity。它把来源信息做成带 X.509 证书签名的断言,用 JUMBF 盒子格式塞进图片,JPEG 里走的是 APP11 段。
硬件端第一次落地是 2023 年 10 月的徕卡 M11-P,机身内置安全芯片,拍完就签名。索尼 2024 年 1 月跟上,A9 III 支持。软件端 Photoshop 的 Content Credentials、微软的 Designer、OpenAI 的图像输出都已经在写这玩意儿。
它和前面四层的本质区别是:EXIF、XMP、IPTC 全是明文,用记事本都能改;C2PA 有签名,改一个字校验就挂。所以未来你判断一张图是不是 AI 生成的,看的不是画风,是这层清单里有没有 c2pa.actions 里那条 c2pa.created 加合成器信息。现在还早,但 2025 年往后这件事会越来越常见。
平台那边还叠了一层你看不见的信息
上面说的都是文件自带的。平台收到你上传的图之后,会自己算一遍指纹:pHash(感知哈希)64 位,aHash、dHash 备用,再加一轮特征点。查重逻辑一般是汉明距离小于 5 到 10 判为同一张,具体阈值各家不同。
这意味着裁掉 10%、加个滤镜、改个亮度,指纹依然撞得上。做电商的朋友应该懂,同一个货源几家店铺用同一批图,重复铺货检测就是这么抓的。指纹和 EXIF 是两码事:平台会把你的 EXIF 剥光,但指纹留在它自己库里。
顺带说说传图渠道,这些是我自己拿几台设备测的,不代表全平台:微信勾选「原图」发送,对方保存后 EXIF 基本还在,GPS 也能读到;朋友圈那版压缩完,我所测的样本里 GPS 已经没了。小红书、微博上传后重新编码,元数据所剩无几。所以「发朋友圈等于公开定位」这说法在我测下来是不成立的,但把原图直接丢给别人,确实是。
怎么查、怎么删,命令都在这儿
查看:Windows 右键属性→详细信息能看到一部分;macOS 用「预览」按 ⌘I 打开检查器;想看得全还是得命令行。
# 看全部,带组名,带标签名缩写
exiftool -a -G1 -s IMG_1234.jpg
# 只看关心的几个
exiftool -Make -Model -LensModel -DateTimeOriginal -GPSPosition -ISO -FNumber -ExposureTime IMG_1234.jpg

# 只清位置,EXIF 和 XMP 里的都清掉
exiftool -gps:all= -xmp:geotag= -overwrite_original *.jpg
# 全清但保 ICC(上面提过)
exiftool -all= -tagsfromfile @ -icc_profile -overwrite_original *.jpg
手机端直接从源头关掉更省事。iOS:设置→隐私与安全性→定位服务→相机→选「永不」。小米:相机→设置→关掉「保存位置信息」。华为:相机→设置→关掉「记录地理位置信息」。批量处理历史照片的话,把一堆图拷到电脑上跑上面那条 -gps:all= 就行,几百张一两秒的事。
最后
我现在的习惯是分两套走:交付给客户的成图,EXIF 时间机型留着,GPS、crs 调色参数、缩略图一律清掉,ICC 保住;私人照片在手机里就把相机定位关了,省得事后一张张补刀。
哦对了,别再问我为什么没事去扒别人的猫片了,这毛病确实有点欠。但你要是也手贱试一次,大概率会跟我一样,从此发原图之前先犹豫三秒钟。