Python中使用libxmp设置XMP元数据属性遇到问题求助
你遇到的核心问题大概率是命名空间没搞对——XMP里所有属性都绑定特定的命名空间,比如你要操作的title、creator、description都属于Dublin Core(DC)命名空间,直接调用set_property只写属性名肯定不行,必须指定完整的命名空间URI。
给你几个具体的排查和修复步骤:
确认命名空间的正确使用
DC命名空间的URI是http://purl.org/dc/elements/1.1/,对应的属性名分别是title、creator、description。调用set_property时,第二个参数必须传这个URI,而不是空或者随便的前缀。比如设置title的正确写法是:int err = xmp_set_property(xmp_obj, "http://purl.org/dc/elements/1.1/", "title", "你的图片标题", 0);检查命名空间是否注册
有些版本的libxmp需要提前注册命名空间,否则无法识别。可以在初始化XMP对象后先注册DC命名空间:xmp_register_namespace("http://purl.org/dc/elements/1.1/", "dc", NULL);第三个参数传NULL表示用默认的前缀映射,这里就是
dc。打印错误码定位问题
每次调用set_property后,检查返回的错误码(比如XMP_ERR_BAD_PARAM、XMP_ERR_NAMESPACE等),对照libxmp的错误枚举定义,就能精准知道是参数错了还是命名空间的问题。别光看报错信息,错误码才是关键。别乱用append_array_item
append_array_item是给数组类型的属性加元素用的(比如多语言的title,dc:title是可以存多个语言版本的数组),如果只是要设置单值的标题,直接用set_property就行,用append反而会因为属性类型不匹配报错。
最后,确保你的XMP对象已经正确初始化(比如调用xmp_new、xmp_open_file成功,没有返回NULL),文件也有写入权限。
内容的提问来源于stack exchange,提问作者Evan Jones

