You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pillow获取图片XPKeywords(40094)元数据仅部分生效问题

解决XPKeywords(EXIF标签40094)无法读取的问题

问题核心

你的Python脚本通过PIL的getexif()读取图片XPKeywords(标签40094)元数据,仅部分图片生效——系统属性显示该字段有数据,但脚本输出中无40094标签;手动修改图片关键词后,脚本可正常读取。已尝试降级PIL、更换piexif模块,问题依旧。

可能原因

  1. 元数据存储位置差异:系统属性会合并显示EXIF、XMP、IPTC中的关键词,但PIL的getexif()仅读取EXIF数据。若Lightroom将关键词写入XMP(而非EXIF的XPKeywords字段),脚本自然读不到。
  2. Lightroom元数据写入策略:部分Lightroom版本默认仅将关键词写入XMP侧栏,不更新EXIF的XPKeywords字段,导致脚本无法通过EXIF读取。
  3. 字段标准不统一:XPKeywords是Windows特有的EXIF字段,部分工具会将关键词存入IPTC的Keywords(标签2:025)或XMP的dc:subject,系统属性统一显示这些字段,但脚本仅查询40094标签会遗漏。

解决方案

1. 扩展脚本,同时读取多位置元数据

不要仅依赖EXIF的40094标签,同时读取XMP、IPTC中的关键词字段,合并结果。推荐使用pyexiv2库(支持读取XMP/IPTC),示例代码:

import pyexiv2
from PIL import Image

def getStudents(image_path):
    # 读取EXIF的XPKeywords(40094)
    img = Image.open(image_path)
    exif_data = img.getexif()
    xp_keywords = exif_data.get(40094, "")
    xp_list = xp_keywords.split(';') if xp_keywords else []

    # 读取XMP和IPTC的关键词
    with pyexiv2.Image(image_path) as img_meta:
        # XMP的dc:subject字段
        xmp_data = img_meta.read_xmp()
        xmp_list = xmp_data.get('Xmp.dc.subject', [])
        
        # IPTC的Keywords字段
        iptc_data = img_meta.read_iptc()
        iptc_list = iptc_data.get('Iptc.Application2.Keywords', [])

    # 合并并去重关键词
    all_keywords = list(set(xp_list + xmp_list + iptc_list))
    return all_keywords

安装依赖:

pip install pyexiv2 pillow

2. 调整Lightroom元数据导出设置

确保Lightroom导出时将关键词写入EXIF的XPKeywords字段:

  • 导出图片时,进入「元数据」选项卡
  • 选择「所有元数据」,或自定义设置并勾选「EXIF」相关选项
  • 若需要同步已有图片的元数据,可在Lightroom中选中图片,执行「元数据 > 将元数据写入文件」

3. 批量同步元数据到XPKeywords

使用ExifTool批量将XMP/IPTC的关键词同步到EXIF的XPKeywords字段,适合处理已有图片:

# 批量将IPTC/EXIF/XMP的关键词同步到XPKeywords
exiftool "-XPKeywords<Keywords" /path/to/your/images

内容的提问来源于stack exchange,提问作者Beu777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:15:45