
本文详解如何使用 Pillow 正确读取和写入 XMP 标签(如 PreservedFileName、dc:Title),解决 EXIF 与 XMP 混淆导致的元数据不可见问题,并提供可运行代码、注意事项及生产级实践建议。
本文详解如何使用 pillow 正确读取和写入 xmp 标签(如 `preservedfilename`、`dc:title`),解决 exif 与 xmp 混淆导致的元数据不可见问题,并提供可运行代码、注意事项及生产级实践建议。
XMP(Extensible Metadata Platform)是 Adobe 主导的现代元数据标准,以嵌入式 XML 形式存储在 JPEG、TIFF、PNG 等图像文件中,支持自定义命名空间(如 xmpMM:PreservedFileName、dc:Title),广泛用于数字资产管理(DAM)、AI 打标固化、重命名备份等场景。但需明确一点:XMP ≠ EXIF——PIL 的 getexif() 只能访问传统 TIFF/EXIF IFD 结构,完全无法触达 XMP 段;若强行调用,你看到的只是相机参数、时间戳等底层硬件信息(正如提问中输出的 36864, 37121 等数值键),而你的 PreservedFileName 和 Title 早已安静地躺在独立的 XMP 数据块里。
✅ 正确做法是使用 Pillow 内置的 getxmp() 方法:
from PIL import Image
img = Image.open("P1050122.jpg")
xmp_data = img.getxmp()
# 查看完整结构(含命名空间)
print(xmp_data)
执行后将输出类似结构(已简化):
{
'xmpmeta': {
'xmptk': 'Image::ExifTool 12.76',
'RDF': {
'Description': [
{
'about': '',
'title': {'Alt': {'li': {'lang': 'x-default', 'text': 'P1050122'}}}
},
{
'about': '',
'PreservedFileName': 'P1050122.jpg'
}
]
}
}
}
? 注意字段路径:
-
dc:Title→ 对应xmp_data['xmpmeta']['RDF']['Description'][0]['title'] -
xmpMM:PreservedFileName→ 对应xmp_data['xmpmeta']['RDF']['Description'][1]['PreservedFileName']
⚠️ 重要前提:Pillow 需依赖 defusedxml 安全解析 XML。若报错 ModuleNotFoundError: No module named 'defusedxml',请先安装:
pip install --upgrade defusedxml
(推荐使用 defusedxml 而非原生 xml.etree,因其默认禁用外部实体、防止 XXE 攻击,符合生产环境安全规范)
? 写入 XMP 尚不被 Pillow 原生支持(截至 Pillow 10.3+)。如需写入(例如批量还原原始文件名、注入 AI 生成标签),必须回退至 exiftool 命令行——这是当前最可靠、跨格式(JPEG/PNG/HEIC/WebP)、可审计的工业级方案:
xmp:Keywords










