一张 JPG 里到底藏了多少东西,我拿朋友的相机样片试过
去年十月,一个做二手相机的朋友把样片发我微信,说"帮我看看这台机器的成色"。我保存到桌面,右键——属性——详细信息,那一栏拉到底:iPhone 14 Pro,2023-04-17 15:42:08,F1.78,曝光 1/160s,ISO 64,焦距 6.86mm,最后两行是一串经纬度。我拿地图一放,东莞大朗镇某个小区,误差十五米以内。他自己完全不知道微信发"原图"是带着这玩意儿的。
那天之后我把图片信息这块翻了个底朝天。下面写的不是从 PDF 文档上抄的说明,是我自己一条条命令敲出来、一张张图比对出来的,所以有些地方会显得啰嗦,请忍一下。
图片信息是分层的,绝大多数人只知道最外面那层
最外面一层叫容器层,就是 Windows 右键属性里那点东西:文件大小、分辨率、创建时间、修改时间。这层最没营养,因为创建时间会被复制、上传、重存反复改掉,你看到的基本是最后一次写入的时间,跟拍下来那会儿没关系。
往里一层是 EXIF,全称 Exchangeable image file format,标准归日本 JEITA 管,现在主流版本是 Exif 2.32(2019 年 5 月发布)。字段按 IFD 分组,0th IFD 放设备信息,Exif SubIFD 放曝光参数,GPS IFD 放位置,Interop IFD 一般没人动。里面大概三类:一类是硬件标识,Make、Model、LensModel、SerialNumber;一类是拍摄参数,FNumber、ExposureTime、ISO、FocalLength、ExposureProgram、MeteringMode;还有一类是时间,DateTimeOriginal 是快门按下的那一刻,DateTimeDigitized 是写入文件的时刻,这俩经常差好几秒。
再往里是 XMP,Adobe 那套,本质是个 XML 塞在 JPEG 的 APP1 段里,能装的东西几乎没有上限,Lightroom 的调色参数、Photoshop 的编辑历史、
以及 IPTC,新闻图片行业的老规范,字段名像 By-line、Credit、Copyright Notice、City、Country Code,路透和 Getty 的图里基本都能看到。
最后还有一个很多人忽略的:ICC 色彩配置文件和像素级隐形水印。前者决定你这张图在别人屏幕上偏不偏色,后者是这几年才起来的东西,后面单开一段讲。
查图片信息,我平时就用这几条命令
先说工具。命令行首选 ExifTool,Phil Harvey 用 Perl 写的,免费,跨平台,支持差不多两万种标签格式,这个数字是它官网自己写的,我信。图形界面的话,Windows 上 ExifToolGUI 凑合能用,macOS 直接按 Cmd + I 调预览的检查器最省事,还能点"在地图中显示"直接跳地图。
# 1. 全量输出,-a 显示重复标签,-G1 标注来自哪个组,-s 用短标签名
exiftool -a -G1 -s photo.jpg
# 2. 只看位置,-n 输出原始十进制数值而不是度分秒
EXIFTOOL -GPSLatitude -GPSLongitude -GPSAltitude -n photo.jpg
# 3. 按时间重命名整个文件夹
exiftool '-DateTimeOriginal<CreateDate' -d '%Y%m%d_%H%M%S' -r ./photos
# 4. 批量清空所有元数据,但保留 ICC 色彩配置(不然颜色会变)
exiftool -all= -tagsfromfile @ -ColorSpaceTags -r -overwrite_original ./photos

# 5. 改回来,把作者和版权写进去
exiftool -Artist='老K' -Copyright='2024 老K, All Rights Reserved' photo.jpg
第 4 条那个 -ColorSpaceTags 是重点,我第一次图省事直接 -all=,结果一批 sRGB 的图颜色全淡了一圈,因为 ICC 配置被一起干掉了,浏览器只能按 sRGB 硬解。
ImageMagick 也能看,identify -verbose photo.jpg | head -60,但输出格式没有 ExifTool 清楚。Python 那边 Pillow 的写法是 img.getexif(),返回的 key 是整数编号,0x0110 是 Model,0x9003 是 DateTimeOriginal,得对着表查,第一次用会骂人。
在线工具我不想推太多,因为你要把私人照片传到别人服务器上。非要用的话,Jimpl 和 metapicz 去掉位置信息比较方便,Pic2Map 能把 GPS 直接标在地图上。用之前想清楚这张图能不能给陌生人看。
各平台发图之后 EXIF 还剩多少,我自己测了一遍
这块很关键,因为很多人以为"平台帮我清了"。以下是我自己反复测的结果,版本更新会变,请以你自己的实测为准。
微信发原图:EXIF 基本完整保留,包括 GPS。微信官方在 2017 年前后就回应过这个事,但很多人还是不知道。朋友圈:清掉大部分,我测到的残留只有方向标记。微博网页版上传:基本全清。Telegram 用"以文件发送":完整保留;用普通发图:压缩并清除。邮件附件:保留。淘宝和闲鱼的买家秀:清。Discord:会清。
所以真要发原始照片给陌生人,最稳的是先在本地过一遍 exiftool -all=,再发。手机端 iPhone 可以在分享时把"位置"那个开关关掉,安卓各家不一样,得翻相册设置里的"移除位置信息"选项。
顺便说一个真实案子。2019 年 9 月,日本一位偶像在东京自家公寓附近被一名男子尾随袭击,警方后来查明,嫌疑人就是靠她自拍里瞳孔反射出的街景,配合 Instagram 上其他照片的角度反推出住址的。这个案子当年在日本社会讨论度很高,也直接推动了日本那边对 SNS 照片元数据的警觉。瞳孔倒影这事听着像电影,但拍照时相机就在眼前,反射的就是你身后的街。
反向搜图到底是怎么匹配的,哈希和特征向量是两回事
先说结论:加滤镜、裁边、改尺寸之后,靠哈希匹配基本就废了。
哈希那套(pHash、dHash、aHash)是把图片降成 8x8 灰度后算指纹,再比汉明距离,一般阈值取 5 到 10 之内算同一张。优点是快,缺点是只要内容变动超过阈值就找不到。所以你裁掉一个边角,TinEye 可能就查不出来了。
特征向量那套就不一样了,它提的是局部特征点,尺度变了、旋转了、加了噪点还能匹配上,代价是慢、吃算力。这也是为什么各家搜图引擎的表现差这么多:
Google Lens 强在识别物件本身和找同款商品,给它一张沙发照能给你推十家店。TinEye 强在找最早出处,结果按时间排序,免费版只能看前几页。Yandex 的人脸和街景识别是真的猛,尤其是东欧和俄罗斯那边的街景数据,我拿一张五年前的莫斯科街拍试过,它能定位到具体路口。百度识图在中文电商图和表情包上比较能打,但泛化能力弱于 Lens。
用的时候注意一个坑:如果你上传的是带 GPS 的原图,部分引擎会把位置当参考信息。想纯粹按画面找,先把元数据清了再传。
从搜索引擎的算法角度看,图片信息是分两套的
一套是文件里的,就是前面说的 EXIF、XMP、IPTC。另一套是网页上下文里的,这套才是爬虫真正吃的东西。
Google 图片索引主要看这几个:文件名(nikon-z6-样张-夜景.jpg 比 IMG_2043.jpg 强,但别堆关键词)、alt 文本、图片周围的正文、页面标题、图片 Sitemap、结构化数据。图片 Sitemap 一个文件最多塞 1000 个 URL,格式上必须有 image:loc,image:caption、image:title、image:license 是可选的。最后那个 license 字段能让你在 Google 图片结果里拿到"可授权"的小徽章,做商用图库的值得加,它对应的是 IPTC 的 Web Statement of Rights 和 Licensor。
性能这块有几个硬指标。WebP 在同质量下平均比 JPEG 小 25% 到 34%,这个数是 Google 自己给的;AVIF 还能再小一截,但编码慢,构建时间会长。loading="lazy" 除了首屏那张 LCP 图,其他全加;首屏那张反过来要标 fetchpriority="high",并且用 <link rel="preload" as="image" imagesrcset="..."> 提前拉。尺寸上别拿一张 4000px 的图缩到 300px 显示,srcset 至少给 1x 和 2x 两档,不然手机白下几兆。
AI 时代又加了一层:C2PA 和隐形水印
C2PA 是 2021 年成立的一个联盟,Adobe 主导,做的是"内容凭证"这套签名机制,本质是用私钥对图片的元数据签名,改一个像素签名就失效。2023 年 10 月,徕卡 M11-P 是第一台机身内置内容凭证的相机;索尼 2024 年通过固件给部分机型补上了写入能力。Photoshop 从 2023 年起也会自动挂上。
但我的看法是:现阶段靠元数据判断一张图是不是 AI 生成的,基本不靠谱。原因很简单,C2PA 是声明式的,删掉、截图、重新编码就没了,而重新编码这件事,微信、微博、小红书每天都在帮你干。
真正难搞的是像素级隐形水印,比如 Google 的 SynthID,把信号嵌在频域里,抗压缩能力强一些。但它也不是无解,只是门槛高。对普通用户来说,判断来源最实在的办法还是看细节:手指数量、文字笔画、反光方向、阴影和光源是否一致。别指望工具给你一个"是/否"的确定答案。
我自己的几点做法,不一定对,仅供参考
第一,发原图给陌生人之前,无条件先清一遍元数据,尤其是带小孩和家里地址的照片。
第二,如果你是做内容的、靠图片吃饭的,反过来别全删。Copyright、Creator、Credit 这些字段留着,被侵权的时候是证据,而且 Google 图片的那个可授权徽章也需要它们。
第三,图片 SEO 不是堆 alt 文本。我见过有人给一张产品图写了两百字的 alt,塞了七八个关键词,结果被判定为堆砌。真正的做法是让图片在页面上有上下文:前后文提到它、标题覆盖它、文件名描述它,这三样一致就够了。
第四,定期检查自己常发的平台。平台改版比你想象的勤,我去年测出来的结论今年就未必成立。所以上面那些实测数据,你自己拿一张带 GPS 的照片跑一遍最靠谱,十分钟的事。