我最早查图片信息,就是右键看属性,或者拖进 Photoshop 看图像大小。
后来帮朋友找一张被盗的探店图,微信保存版只有 86 kB,exiftool 只吐出 JFIF Version 1.01、Encoding Process Baseline DCT、ICC_Profile,拍摄时间、GPS、机型全空。
那一刻我才意识到:图片信息不是一层,至少是三层——容器层、像素层、语义层。
只看 EXIF,就像只看快递面单;面单可以撕掉,也可以伪造,但箱子里的东西、胶带折痕、重量还在。
第一层:容器层,EXIF 不是唯一
容器层包含文件头、元数据、色彩描述。
JPEG 看 APP1 段里的 EXIF,常见字段有 Make、Model、LensModel、FNumber、ExposureTime、ISO、DateTimeOriginal、GPSLatitudeRef、GPSLongitude,EXIF 段最大约 64KB。
PNG 看 tEXt、iTXt、zTXt chunk,IHDR 固定 13 字节,宽高各占 4 字节。
WebP 是 RIFF 容器,VP8X chunk 里的 flag 决定有没有 alpha、EXIF、XMP。
HEIC 是 ISO BMFF box,重点看 meta、iprp、iloc,很多手机默认拍 HEIC,传电脑后属性会变。
工具对比我自己的用法:
exiftool -a -G1 -s image.jpg 读得最全,连镜头序列号都能挖,但批量慢;exiv2 -pa image.jpg 快,适合脚本;identify -verbose image.jpg 看像素尺寸、色彩空间、深度更直观;ffprobe -show_format -show_streams image.jpg 对视频封面、HEIC 有时更稳。
安装:Ubuntu 跑 sudo apt install libimage-exiftool-perl;Windows 下载 exiftool.exe,改名 exiftool.exe 放进 PATH。
步骤:先 exiftool -DateTimeOriginal -GPSLatitude -GPSLongitude -Model -LensModel *.jpg,再 exiftool -all= -overwrite_original image.jpg 清隐私。
注意:EXIF 可写,exiftool -Model='iPhone 15 Pro' 这种命令就能改,所以别把 EXIF 当法庭证据。
第二层:像素层,EXIF 删了也藏不住
平台重编码会清 EXIF,但像素会留下压缩痕迹。
JPEG 按 8×8 块做 DCT,不同相机、不同软件的量化表不一样,截图、微信、微博、小红书各有自己的“口味”。
我常用感知哈希 pHash:pip install imagehash,然后 from PIL import Image; import imagehash; phash = imagehash.phash(Image.open('a.jpg')),得到 64 位指纹。
汉明距离 ≤5 通常同图,≥10 基本不同;MD5 和 SHA256 只能查完全一样,改一个像素就全变。
另一个办法是 ImageMagick:compare -metric RMSE a.jpg b.jpg diff.png,RMSE 0.02 以内很像,0.05 以上要谨慎。
去年十一月我帮朋友追一张 3024×4032 的原图,下载版是 1080×1440,MD5 完全不同,pHash 距离 4,SSIM 0.91。
这说明:找原图、去重、查盗图,优先用 pHash + SSIM;版权取证再回到原文件 SHA256。
额外参数:用 exiftool -b -ThumbnailImage image.jpg > thumb.jpg 能导出内嵌缩略图,有时缩略图没被裁,能看到原图边缘。
但别过度神化:pHash 也会碰撞,尤其是纯色图、文字截图、表情包。
第三层:语义层,搜图引擎各有脾气
现在查图片信息,不只查元数据,还要查“图里是什么”。
Google Lens 适合找同款商品、景点、植物;TinEye 适合找最早出现,2017 年之前的图有时能挖到;Yandex 对人脸、场景、相似构图更狠;Baidu 识图对中文互联网、表情包、国内电商更全。
我自己的顺序:先 TinEye 看最早时间,再 Google Lens 看主体,再 Yandex 看相似构图,最后百度看中文来源。
语义向量也能量化:CLIP 输出 512 或 768 维,余弦相似度 >0.85 通常同语义,>0.92 很可能同主体。
OCR 方面,Tesseract 5 对清晰截图中文一般,PaddleOCR 对表格、竖排更好;命令是 tesseract image.png stdout -l chi_sim+eng。
搜图时别只传一张原图。
裁主体、调亮度、镜像翻转、加 10% 白边,各试一次,命中率经常差一倍。
隐私提醒:上传前跑 exiftool -all= -overwrite_original image.jpg,但清元数据不等于去水印、去人脸、去背景。
如果图里有身份证、合同、门牌,先打码,再考虑要不要传。
我的独立观点:三层交叉,别做单层侦探
容器层告诉你“谁写的”,像素层告诉你“是不是同一张”,语义层告诉你“像什么”。
三者交叉才有意义:EXIF 时间 + GPS 可以定位,pHash 可以追传播链,语义搜索可以找上下文。
常见误区有四个:一是只看属性就说原图,其实微信、微博、小红书都会重编码;二是拿 Photoshop 改的 EXIF 当证据;三是把 pHash 当加密哈希,它碰撞率不低;四是用在线网站传身份证、合同,服务器可能留存。
我的建议:本地优先,exiftool + imagehash + Tesseract 三件套;真要搜图,先清隐私再传。
批量处理可以写:for f in *.jpg; do exiftool -Model -DateTimeOriginal -GPSPosition "$f"; done。
最后说句不讨喜的:你搜“图片信息怎么查”,先问自己要查什么。 查拍摄设备,看容器层;查是否原图,看像素层;查盗图来源,看语义层;查隐私泄露,三层都要看。 目标不同,工具顺序完全不同。 别指望一个网站、一个右键属性解决所有问题。