哪些工具会把标签剥掉
亚马逊是在上传那一刻从 XMP 的 dc:subject 里读 contains-synthetic-performer。所以一个被中间环节悄悄丢掉的标签,和没打标是一样的。 平台与咨询机构的说法都停在「有些系统会在导出时移除嵌入的元数据」——从没说是哪些。 那就实测一遍。
测的 8 个处理步骤,没有一个能在两种格式上同时保住标签。 其中 5 个 JPEG 和 PNG 都丢,另外 3 个在 JPEG 上保住了、 到 PNG 就丢。最普通的那一步——用常规图片库重新保存一遍——就在两种都丢的 5 个里。
| 处理步骤 | JPEG | PNG | 它代表什么 |
|---|---|---|---|
| 原样复制文件 (对照组) | ✓ 保留 | ✓ 保留 | 不做任何处理 —— 用来验证测量方法本身可靠 |
| Pillow 重新保存 | ✕ 被剥掉 | ✕ 被剥掉 | 绝大多数 Python 图片流水线与批处理脚本的默认行为 |
| Pillow 缩放后保存 | ✕ 被剥掉 | ✕ 被剥掉 | 生成缩略图、批量改尺寸的常规做法 |
| Pillow 降质压缩 | ✕ 被剥掉 | ✕ 被剥掉 | 为压体积重存 JPEG |
| Pillow 保存时把 xmp 传回去 | ✓ 保留 | ✕ 被剥掉 | 同一个库,多传一个参数 —— 这说明它是可以避免的 |
| macOS sips 缩放 | ✓ 保留 | ✕ 被剥掉 | macOS 自带;「预览」的导出和访达的批量调整走同一套底层 |
| macOS sips 转格式 | ✓ 保留 | ✕ 被剥掉 | PNG 与 JPEG 互转 |
| ffmpeg 重编码 | ✕ 被剥掉 | ✕ 被剥掉 | 很多素材流水线和转码服务的内核 |
| Squoosh(squoosh.app) (浏览器实测) | ✕ 被剥掉 | ✕ 被剥掉 | Google 的在线压图工具,用其默认的 mozJPEG / OxiPNG |
| Canva 往返 (人工实测) | ✕ 被剥掉 JPEG 进 → PNG 出 | 导入再导出。XMP 并没有被删掉 —— 是 Canva 自己的包把它替换了,所以文件看着仍然带元数据 | |
| 微信桌面版 · 文件传输助手 (人工实测) | ✓ 保留 文件传输,JPEG | 电脑传电脑,界面上没有「原图」选项。收到的文件与原文件逐字节一致 | |
| 微信手机版 · 勾选「原图」 (人工实测) | ✓ 保留 文件传输,JPEG | 手机传电脑,勾上原图。同样逐字节一致——文件是被原样转交,没有被处理 | |
| 微信手机版 · 未勾「原图」 (人工实测) | ✕ 被剥掉 重新编码,JPEG | 手机发照片的默认方式。图被缩到 2293×1280、重新编码到原体积的 41%,XMP 整块消失 | |
三个值得记住的结论
- 只要重新保存一次就可能丢。不用裁剪、不用调压缩、不用点导出对话框,单纯用常规图片库打开再存一次,XMP 就没了。 任何把图过一遍脚本的环节都值得怀疑。
- PNG 比 JPEG 更容易丢。所有在 JPEG 上保住标签的步骤,在 PNG 上都丢了。如果一张商品图两种格式都行, JPEG 是更稳的载体——这也正是亚马逊偏好的格式。
- 这是可以避免的,不是宿命。默认会丢标签的那个库,只要保存时把 XMP 显式传回去就能保住。 工具丢元数据是因为没人要求它保留,不是因为做不到。
文件里有元数据,也可能照样不合规
Canva 其实什么都没删。导出的文件里 XMP 还在——只不过换成了 Canva 自己的那一份,描述的是 Canva 的文档, 而原本躺在 dc:subject 里的合规标签不在里面了。 如果只是粗略地问一句「这文件有没有元数据」,它能干干净净地通过,而亚马逊真正要读的那个东西已经没了。
这就是为什么检查器必须报三种状态而不是两种:标签在、有元数据但没有标签、什么都没有。 中间那种,正是看着没问题、实际有问题的那一类。
如果你还烧了可见标签,这一点尤其要注意:可见标签会活下来,因为它是像素。图片从 Canva 出来时,角上那行「AI-generated person」还在, 而机器可读的标签已经没了——看着让人放心,但它是错的。
「传输」和「处理」是两回事
微信是这一页上最干净的一组演示,因为同一个 App、同一个动作,只因为一个勾选框就走向了相反的结果。 手机发送时勾上「原图」,文件逐字节一致——SHA-256 相同、仍是 2752×1536、标签完好。不勾(也就是默认方式),到手的图被缩到 2293×1280、体积只剩原来的 41%, XMP 整块消失。
微信本身没什么特殊。它转交文件时标签活着,它重新编码时标签就死了——这跟表里其他每一行落在同一条线上。 所以判断任何一个环节,真正该问的不是「这是哪个 App」,而是它有没有重新编码这张图?压缩、缩放、转格式、编辑器打开再保存——都是重新编码,这里全都丢了标签。 复制、打包、以文件形式发送——都不是,字节原样出来。
用微信传素材,一定要勾「原图」。默认那条路会无声地把标签抹掉,而图片看起来完全正常—— 包括烧进像素里的可见标签,它会安然通过,机器可读的那个不会。
对上传前的实际意义
标要晚打,验要最后做。如果打标发生在修图、缩放、压缩之前,就得默认标签未必活到了卖家后台。把最终文件拖进检查器——是你真正要上传的那一份,不是它的母版。
检查我的文件 →方法
每一步都从一张全新的 1200×1200 图开始,先用本站自己的写入代码打上标签,过一个处理步骤, 然后读回两次——一次用我们的读取器,一次用 Pillow 独立的 XMP 解析器。 两个读数不一致的行会被标出来而不是直接发布;本次没有出现不一致。
另有一行「原样复制」作对照组。它要是报告标签丢了,说明测量方法本身有问题、其余所有行作废—— 它在两种格式上都通过了。
python3 tools/metadata-strip-test.pySquoosh 跑在浏览器里,脚本够不着,所以那一行是驱动一个真实 Chrome 测的——上传、切编码器、下载、读回。 编码器有没有真的切过去,以下载文件名的扩展名为准,而不是看下拉框自己报的值: 受控组件可能报告一个它其实没应用的设置。第一次尝试就是这样,声称在测 PNG、实际输出的是 JPEG,那一轮已作废。
python3 tools/squoosh-strip-test.py tagged-sample.png oxiPNG脚本在仓库里,你自己跑一遍应该能复现这张表。测试于 2026-07-28,环境:macOS 26.2、 Pillow 12.1.1、ffmpeg 8.0.1、Node v25.6.0。
没覆盖到的部分。表里都是能脚本化的步骤。Photoshop、Lightroom、Canva、企业内部素材库和代理商门户需要账号或图形界面, 所以不在表内——没被测到不等于安全。如果你测过其中某一个,用上面同一套方法即可。
结果对应上面列出的具体工具版本,不同版本行为可能不同。