Exif 查看

自写 JPEG/TIFF/PNG/WebP 的 Exif 段解析,逐 IFD 列原始值与换算值。

这是一份从零手写的 Exif/元数据解析器,不依赖任何第三方库,所有解析都在浏览器本地完成,图片不上传。它按容器分流,JPEG、裸 TIFF、PNG 的 eXIf 块与 WebP 的 RIFF 内 EXIF 块走同一套 TIFF 内核:内核认 II(小端)与 MM(大端)两种字节序、校验 0x002A 魔数,随后沿 IFD0 → ExifIFD(0x8769)→ GPSIFD(0x8825)→ InteroperabilityIFD(Exif 子 IFD 里的 0xA005)的指针链以及 IFD1(缩略图,走 next 指针)逐目录读取。每个标签列出所属 IFD、十六进制 tag id、人类可读名、类型与数量、原始值与换算值,页面顶部那颗小标签实时给 已命名/总标签数。

HEIF/AVIF 的 isobmff 盒链没有实现,所以遇到这类文件会直说“无法识别”,绝不假装支持;也不认 BigTIFF 的 0x0043,并据此给出说明。指针只从各自的上级目录取,不做任意深度递归,所以自指的目录链不会把页面绕进去。时间串是 EXIF 特有的 “YYYY:MM:DD HH:MM:SS”,日期部分用冒号、且不含时区,页面只如实转述,不臆测它属于哪个时区。截图和被社交软件转码的网图通常已被剥离 EXIF,这是文件本来就没有,不是解析失败。

Exif 查看怎么用

  • 拖入或选择图片:支持 JPEG/TIFF/PNG/WebP;拖进上方区域、点击选择、Ctrl/⌘+V 粘贴都可以,超过 16MB 为防卡页不处理。解析后先给一排小标签:文件名与字节数、容器、字节序、已命名/总标签数,WebP 多一个动图判定(是/否/未检出),JPEG 多 APP1 时给段数并标是否含 XMP;有警告就逐条列在旁边,不静默。
  • 逐标签查看:左边是原图预览与几张关键卡(尺寸、朝向、快门光圈、GPS 十进制度、拍摄时间),右边按 IFD 分组,每组一个折叠块,块内一行四栏:名称 · id|类型×数量|解释值|原始值。组头那排按钮切「全部|仅已命名」,筛选框按名称、0x id、类型或值搜(例如 gps、f/2.8),命中数实时显示;筛选只动这一块,上面的关键卡与下面的 JSON 导出不受影响。表里没有的标签以 Tag_0xXXXX 列出,仍能看到它的类型与原始值。
  • 缩略图与导出:若 IFD1 含 JPEG 压缩缩略图,会渲染在左栏并标字节数,可单独下载。页面底部是折叠块:有文本元数据(PNG 的 tEXt/iTXt/tEXt 一族)时单独一块,然后是「结构化导出 JSON」一块,展开是完整 JSON 文本、旁边一个下载 .json 按钮,块头写着字符数——收起不影响上面的读数,筛选也不改动导出内容。JSON 自行选中复制即可,本页没有复制按钮,也没有收藏或上传。
  • JPEG 的段是怎么走的:JPEG 会在 SOI 之后沿“标记 + 段长”逐段走位(而不是天真地全局搜 FF E1——那对字节也可能出现在压缩熵数据里),找到 APP1 的 “Exif\0\0” 段后解析其内嵌 TIFF;途中 COM、APP2 的 ICC 剖面会被干净跳过,遇到 SOS 立即停止按段长解析;一个文件里有多个 APP1(例如 XMP 与 Exif 并存)也会被分别识别并计数。裸 TIFF/PNG 的 eXIf 块/WebP 的 RIFF 内 EXIF 块走同一套 TIFF 内核。页面口径与工具描述一致:JPEG、TIFF、PNG、WebP。
  • 值类型与目录护栏:值类型按规范尺寸解码:BYTE/ASCII/SHORT/LONG/RATIONAL/UNDEFINED/SLONG/SRATIONAL/FLOAT/DOUBLE,超过 4 字节的值走“偏移间接”,越界指向文件末尾之外的偏移会被截断并记录警告,而不是读出乱码或死循环;单个目录声明超过 4096 个条目时只读前 4096 个并记一条警告。

常见问题

为什么我的照片查不到任何 Exif?

最常见的原因是这张图本来就没有元数据:系统截图、网页上传后重新编码、聊天软件转发时通常会剥离 EXIF。这不是解析器出错——工具会明白告诉你“没找到”,并解释同一尺寸下剥离版与完整版会差几百到几千字节。相机直出的原图才带完整链路(Make/Model/拍摄参数/GPS 等)。

GPS 经纬度那几个度分秒是怎么变成一个数字的?

EXIF 的 GPSLatitude/GPSLongitude 各存三个 RATIONAL(度、分、秒),本页按 度 + 分/60 + 秒/3600 合成十进制度,例如 31°12′0″ 得到 31.2,再依据同目录里的 LatitudeRef=N/S、LongitudeRef=E/W 给南纬/西经取负号;海拔则按 AltitudeRef 判断是高于还是低于海平面。这套换算在页面单测里对着已知字节断言过。

显示的时间是哪里的时间?

就是相机当时记录的本地时间,不含时区信息。EXIF 的 DateTime/DateTimeOriginal 是 20 字节的字符串,日期用冒号分隔、没有任何 UTC/偏移标记,很多相机写入的就是拍摄所在地的表钟时间。所以跨时区比对或排序时,别把这几个字段当成 UTC——本页不会假装知道它属于哪个时区。

那些人类可读的标签名是从哪来的?

自建的表覆盖 Make/Model/Orientation/DateTime/ExposureTime/FNumber/ISO/FocalLength/FocalLengthIn35mmFilm/MeteringMode/LightSource/Flash/ColorSpace/ExifPixelXDimension/GPS 经纬度与海拔/GPSDateStamp/InteroperabilityIndex 与 RelatedImageWidth/Height/缩略图块等。表里没有的 id 也会以 Tag_0xXXXX 形式列出并计入“未命名”。

解释值是按什么口径换算的?

换算细节刻意对齐摄影师的直觉:RATIONAL 显示成带小数的比值,ExposureTime 反算成熟悉的 1/60 s 快门分式、FNumber 显示 f/2.8、曝光偏置带正负号和 EV;Orientation 展开成八种具名情况(“6 顺时针旋转 90°”这类),GPS 的三个度/分/秒 RATIONAL 合成十进制度并按 N/S、E/W 定正负,海拔再按 AltitudeRef 标注“低于海平面”。

对应功能编号 #83无需安装,手机端同样可用按 Ctrl + K 换工具