微信发「原图」到底会不会暴露住址?我把 6 个平台的图片元数据全扒了一遍

关键词:EXIF,图片元数据,照片定位,发原图,exiftool

摘要:一张照片里藏着的不只是画面。拍摄时间、机型、镜头型号、经纬度、修图软件版本,甚至 AI 生成的 prompt,全在文件头那几十 KB 里。这篇把 EXIF 的实际结构、6 个平台的传输差异、删元数据时的漏网之鱼,以及一条 exiftool 命令能搞定的事全写清楚。

微信发「原图」到底会不会暴露住址?我把 6 个平台的图片元数据全扒了一遍

图片

前年秋天我朋友在闲鱼卖一辆二手公路车。傍晚在小区楼下随手拍了张,车靠着花坛,背景是单元楼号。挂上去不到两小时,有人留言:兄弟你这小区是不是 X 区 X 栋,我住 3 栋,明天顺路来看看车。

他当时给我打电话,声音都是飘的。我让他把发出去的那张图再传我一份,exiftool 一跑,GPSPosition 那一行就躺在那儿:31° 14′ 22.31″ N, 121° 28′ 05.17″ E。秒的小数点后两位,粗算误差不到 15 米,楼号都不用猜了。

他把图删了重发,这次是从微信聊天记录里存的图。我再跑一遍——位置没了,相机型号没了,字段只剩三个:ImageWidth、ImageHeight、Orientation。

同一张照片,两次发布,元数据的差别就这么大。所以这篇我想把这事讲透一点,包括那些教你「一键清 EXIF」的工具为什么可能没清干净。


一、EXIF 不是「可能有点信息」,它是 64KB 的抽屉

JPG 文件开头是 FFD8,紧接着是各种 marker 段。APP1(FFE1)这个段就是装 EXIF 的,长度字段占 2 个字节,所以理论上限 65535 字节。去掉固定头,实际能塞进去 60KB 出头。

这点空间能装的东西,超出大多数人想象:

  • DateTimeOriginal:精确到秒。半夜拍的图,第二天早上发,时间戳不会变。
  • Make / Model / LensModel:iPhone 15 Pro 会写成 iPhone 15 Pro back triple camera 6.765mm f/1.78,连用的是哪颗镜头都分得出来。
  • 曝光三件套:FNumber、ExposureTime、ISO。ISO 6400 说明当时挺暗的,室内还是室外,懂行的人一眼能推。
  • GPSLatitude / GPSLongitude / GPSAltitude:高度也存。住 6 楼还是 26 楼,能推出来。
  • Software:修图软件和版本。Photoshop 24.1 和 Capture One 16.2 留下的东西不一样。
  • Orientation:这玩意儿被删掉之后,很多老看图软件会把竖拍的图横过来显示。这是删元数据的一个副作用,后面讲。
  • IFD1:一张内嵌缩略图。这是最大的坑。

还有 MakerNote,厂商自己定义的私有区,索尼、佳能、尼康在里面各塞各的。二手相机看快门数就从这里扒——不过不是每台都行,我手上这台索尼用 exiftool 能直接读出 ShutterCount,朋友那台佳能 6D 就怎么都读不出来,最后靠专门的软件才看到。

图片

顺便说个反直觉的:截图几乎没有 EXIF。iPhone 截图只有几条基础字段,没有 GPS,也不带拍摄参数。所以那些「不小心截图了位置」的说法,基本可以划掉了,截图泄不了位置。

二、6 个平台实测

先说清楚前提:我测的时候是 iPhone 15 Pro 拍的一张原图,带完整 GPS 和高度,微信 8.0.4x、微博 14.x、小红书 8.x、Telegram 10.x。平台策略随时会改,结论只作参考,但你自己按第三节的方法,十分钟就能复现。

  • 微信聊天,勾「原图」发送:完整保留,GPS 在。微信自己会弹一句提示,「原图将包含拍摄信息」——这句话是真的,不是吓唬你。
  • 微信聊天,不勾原图:重新编码压缩,EXIF 基本清空,只剩尺寸和方向。长边压到 1280 左右。
  • 微信朋友圈:压缩加剥离。我这张只剩三个字段。
  • 微博:剥离。压缩比微信还狠一点。
  • 小红书:剥离。
  • Telegram,用「文件」方式发:完整保留。用「照片」方式发:压缩加剥离。
  • 邮件附件:完整保留。所以别以为发邮件就安全了。
  • iMessage 直接发:保留原图。

规律很简单——平台只要对你上传的图做过一次重新编码,EXIF 就没了;凡是走「原文件传输」的通道,元数据全在。

这个规律反过来也成立:如果你收到一张图,元数据干干净净只剩尺寸,说明它至少被重新编码过一次,你看到的画质已经被动过手脚了。

我想说的一个观点是:EXIF 删不删,从来不是隐私问题,是传输模式问题。同一个 App 里勾不勾一个按钮,结果差 60KB 的信息。绝大多数人以为自己「发了张图」,其实是在两种完全不同的协议里做了一次选择,而那个选择对你来说几乎没有任何提示。

三、删了 EXIF,不等于删干净

这是最容易翻车的地方,也是我比较晚才知道的。

图片

JPEG 的 EXIF 结构里有两个 IFD:主图的 IFD0,和缩略图的 IFD1。IFD1 指向一张内嵌的内嵌 JPEG 缩略图,通常是 160×120,或者长边 160 像素。

问题来了:很多批量「去元数据」的工具,只清掉了主 IFD 里的 GPS 字段,内嵌缩略图还在。而缩略图本身可能带着它自己的一份元数据,甚至就是压缩前的原图。

你可以在电脑上跑这一行验证:

exiftool -b -ThumbnailImage 照片.jpg > thumb.jpg

如果这条命令吐出来一个 thumb.jpg,说明你的图里确实藏着一张你看不见的小图。打开看看——有些平台压缩主图的时候把缩略图留下了,那张小图是压缩前的版本。

除此之外,还有几个常被忽略的容器:

  • PNG 的 tEXt / iTXt / zTXt 块。文本随便塞。chunk 长度字段 4 字节,理论上能塞 4GB。
  • XMP 包。可以塞编辑历史、关键词、人脸标记。
  • ICC 色彩配置文件。删了它有些图会偏色,因为原本是 Display P3 拍的,被按 sRGB 解释了。
  • JPEG 文件尾部。JPEG 的结束标记是 FFD9,如果 FFD9 之后还有数据,就是被追加了东西。有人用这招做「图种」,一张图改后缀名解压出压缩包,就是这么来的。检查方法很简单,用 HxD 打开看最后几个字节,或者跑 exiftool -a -G1 -s 照片.jpg,看有没有异常的尾部数据。

四、换个思路:判断图是不是 AI 生成的,别看像素,看容器

网上教「识别 AI 图」的文章,基本都在讲手指、牙齿、背景里飘着的文字。这些东西三个月就过时了,模型迭代一次全修好。

我自己的习惯是反过来的:先不看画面,先看容器。

图片

Stable Diffusion 的 WebUI 出图默认是 PNG,它会把生成参数写进 PNG 的 tEXt 块,字段名叫 parameters,内容长这样:

a photo of ..., Negative prompt: ..., Steps: 28, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 3847561029, Size: 512x768, Model: ...

一条命令就能揪出来:

exiftool -PNG:text:all 图.png

ComfyUI 走的是不同的键,一般在 workflow 和 prompt 两个 JSON 里,里面是整个节点图,连用了哪个 LoRA、权重多少都写得清清楚楚。

但要注意,这招只对「原生导出」的图有效。图一旦经过微信、微博、小红书转一圈,PNG 会被转成 JPEG 重新编码,tEXt 块连影子都没了。所以它能证明「是 AI 生成的」,没法证明「不是」。

这里我又想多说一句:图片的「真实性」从来不在像素里,在容器里。你看到的 100 万像素是给人眼看的,剩下的那 60KB 是给机器看的。而人眼和机器读到的东西,经常不是一回事——现在做鉴定的路子基本都往后者走了,因为前者太容易被骗。

五、动手:查看、删除、保留三套命令

先装 exiftool:

  • Windows:官网下载 zip 包,把 exiftool(-k).exe 重命名成 exiftool.exe,丢到 C:\Windows 下,CMD 里就能直接调。不想动系统目录就放一个文件夹里,把那个文件夹加到 PATH。
  • Mac:brew install exiftool
  • Linux:sudo apt install libimage-exiftool-perl
  • 手机:iOS 越狱太麻烦,实际上系统自带的照片 App 分享时就有「包含位置」开关,安卓用 Scrambled Exif 这类。手机上批量处理还是算了。

图片

查看全部:

exiftool -a -G1 -s 照片.jpg

-a 显示重复标签,-G1 按组分类,-s 显示标签真名而不是描述。三个一起用才看得全。

只看位置:

exiftool -GPSPosition -n 照片.jpg

-n 是输出原始数值,不加它会输出 31 deg 14' 这种格式,粘到地图里麻烦。拿到 31.xxxxx, 121.xxxxx 直接扔高德或者 Google Maps 搜索框。

删掉 GPS 但保留版权信息:

exiftool -gps:all= -Artist=张三 -overwrite_original 照片.jpg

全删:

图片

exiftool -all= -overwrite_original 照片.jpg

几个坑,踩过才知道:

  1. 不加 -overwrite_original,exiftool 会留一个 照片.jpg_original 备份文件。三张图还好,三百张就乱了。
  2. 加 -P 可以保留文件修改时间。不加的话改完元数据,文件日期全变今天,按时间排序的照片就全乱套。
  3. -all= 会把 Orientation 也删掉。删之前最好确认你的看图软件不吃这个字段,否则竖拍照片会躺下。
  4. HEIC 文件 exiftool 也能处理,但 Windows 不装 HEVC 扩展连预览都预览不了,更别说检查了。想省事就在 iPhone 设置里把相机格式改成「兼容性最高」,拍出来直接是 JPEG。

六、我现在是怎么做的

说实话,大部分时候我懒得管。日常发群里的图,微信自动帮我压了,横竖也没人闲到去扒我的群聊图。

但有两种情况我一定过一遍:

一是任何带地理位置背景的照片,往外发之前先跑一遍 -gps:all=。不是怕被人查到,是这个成本太低了——一行命令的事,一次不做可能就要搬家。

二是给别人发的「原文件」。你要发原图,就把原图该有的东西一起担着,文件名、EXIF、内嵌缩略图,一个不落全交出去。这话听着像废话,但就是因为大家都觉得「发张图而已」,那哥们儿的楼号才会出现在闲鱼评论里。

还有个小事:我现在手机相册里存了一份 exiftool 的命令备忘,删图之前先复制粘贴跑一遍。用了快一年,删过大概两千多张图的元数据,中间踩过一次坑——有一次批量删完,发现所有照片的文件日期全变成当天了,三百多张旅行照的排序全乱。后来才知道要加 -P。

差不多就这些。工具就一个 exiftool,常用命令不超过十条,花二十分钟摸一遍,比看十篇「隐私保护指南」管用。

标签: