照片元数据保真验证:样本、校验值与复现方法
下载公开合成样本与验证脚本,复核 JPEG、PNG、WebP 和经典 TIFF 修改元数据后图像数据不变,以及原图 ZIP 的逐字节一致性。
更新于版本 v1 · 2026-10-30 · 公开资料下载免费,无需账户或下载方案。
下载完整证据包
下载验证资料包 ZIP · 样本清单与源文件校验值 · 完整结果 JSON · 方法与许可说明(英文)
资料包包含源样本、四种操作的输出、原图 ZIP、写入器代码快照和验证脚本。照片都是程序生成的微型色块,作者、相机与坐标为刻意设置的测试值,无真实人物或拍摄地点。
逐样本结果:图像数据与像素前后一致
每个样本执行:修改作者/相机/GPS、仅 GPS、仅 EXIF、全部元数据范围。两列分别比较保留的图像区块字节与解码后的原始像素。展开最后一列可下载对应输出并查看字段前后值。
| 源样本 | 图像数据 | 解码像素 | 证据 |
|---|---|---|---|
| jpeg3 × 2 · 8 bit · 1 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| png3 × 2 · 8 bit · 1 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| webp-lossless3 × 2 · 8 bit · 1 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| webp-lossy3 × 2 · 8 bit · 1 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| tiff-lzw3 × 2 · 8 bit · 1 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| tiff-deflate3 × 2 · 8 bit · 1 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| tiff-16bit3 × 2 · 16 bit · 1 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| tiff-multipage3 × 4 · 8 bit · 2 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
| webp-animated3 × 4 · 8 bit · 2 页/帧 | 4 / 4 一致 | 4 / 4 一致 | 输出、字段与 SHA-256源文件 SHA-256 修改作者与 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Fidelity Edited",
"make": "Fidelity Camera",
"latitude": -33.5,
"longitude": 151.20000000000002
}
}仅 GPS文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": null,
"longitude": null
}
}仅 EXIF文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
}全部元数据范围文件 SHA-256(元数据改变,文件值随之改变) 保留的图像数据 SHA-256(前后一致) 解码像素 SHA-256(前后一致) 已断言字段的前后值 {
"before": {
"artist": "Synthetic Author",
"make": "Synthetic Camera",
"latitude": 46.5,
"longitude": 11.8
},
"after": {
"artist": null,
"make": null,
"latitude": null,
"longitude": null
}
} |
下载原图 ZIP — 9 个文件均使用 STORE,解包后 SHA-256 与源文件清单一致。原图包含原始测试元数据,不应用修改或清理。
在本机复现,无需购买下载方案
- 下载并解压完整资料包;安装 Node.js 22.13 或更高版本。
- 在解压目录执行以下命令。首次安装会下载 sharp 解码依赖;验证本身仅在本机读取资料包,不上传照片。
npm install npm run verify
- 预期输出为 36 次转换通过,9 个原图条目为 STORE 且字节一致。脚本会重新生成输出,与公开文件逐字节比较,而非只相信结果 JSON。
- 也可将源样本导入查看器,再将公开输出导入,核对作者与 GPS 字段。工作台的图片下载仍受原有方案规则约束;本页证据文件可直接免费获取。
公开检查使用 sharp 0.35.4 / libvips 8.18.6. 资料包固定 sharp 版本,输出中记录实际解码器版本;不同解码器或平台的像素差异需单独分析。
到底比较了什么?
- JPEG:从第一个 SOS 标记到文件结尾的压缩扫描数据。PNG:图像/动画及选定色彩区块。WebP:压缩图像、透明度、动画与 ICC 区块。经典 TIFF:全部页面的图像条带或图块。
- 使用 sharp 独立于元数据写入器解码,对照原始像素、尺寸、位深、页数和帧延时;16 位样本以 ushort 比较,不降到 8 位。
- 断言作者、相机和 GPS 的预期变化。修改后作者为 Fidelity Edited;仅 GPS 后作者保留、坐标为空;仅 EXIF 与全部范围后这些测试字段为空。
- 写入器快照与 JPEG、原图 ZIP 函数直接取自本次站点代码。脚本校验快照哈希以标记版本;它不是第三方认证。
覆盖范围与限制
这是一组公开、可复现的微型合成测试,不代表所有相机文件。包含有损/无损和动态 WebP、LZW/Deflate TIFF、16 位及多页 TIFF;不覆盖 BigTIFF、所有厂商扩展、异常目录或大文件压力。
本组样本不含旋转方向。校验未执行自动旋转;其他 JPEG、PNG 或 WebP 文件清除方向字段后,显示方向可能变化,即使图像压缩字节没变。TIFF 界面仅预览第一页,导出修改应用全部页面。
仅 GPS 不会清除 XMP/IPTC、文件名或画面中的位置线索。全部范围仍保留解码/色彩所需数据,经典 TIFF 还保留布局和方向字段。本页只断言列出的字段,不提供取证级匿名保证。
给教程作者:如何引用
欢迎引用结果与方法,并附上样本覆盖范围和“产品作者合成测试”的说明。图片样本与其转换副本按 CC0 1.0 公开,可用于教程;代码与第三方库遵循各自许可,见资料包说明。
EXIF Studio. 照片元数据保真验证, v1 (2026-10-30). https://exifdesk.com/zh/fidelity-verification#results
稳定引用锚点: #results · #method · #limits. 发现不一致时,请说明样本、操作、Node/解码器版本并联系 support@exifdesk.com.