基于xmp-core-dotnet更新图片XMP数据的技术问题
C# 处理图片XMP:注册自定义命名空间与保存修改
你目前使用Metadata-Extractor读取XMP数据、xmp-core-dotnet处理XMP元数据的方案是可行的,针对你遇到的两个问题,解决方案如下:
问题1:注册新命名空间
xmp-core-dotnet中的XmpSchemaRegistry是全局注册表,只需注册一次即可在所有IXmpMeta实例中使用,无需为单个实例单独注册。具体步骤:
- 获取全局注册表实例
- 调用
RegisterNamespace方法注册自定义命名空间(参数为命名空间URI和前缀)
示例代码:
// 获取全局XMP schema注册表 var schemaRegistry = XmpSchemaRegistry.GetInstance(); // 注册自定义命名空间:URI + 前缀 string customNsUri = "http://your-custom-namespace.com/1.0/"; string customNsPrefix = "custom"; schemaRegistry.RegisterNamespace(customNsUri, customNsPrefix); // 之后即可使用URI或前缀设置自定义属性 xmp.SetProperty(customNsUri, "YourCustomField", "自定义属性值"); // 或者用前缀简化写法 xmp.SetProperty(customNsPrefix, "YourCustomField", "自定义属性值");
问题2:将修改后的XMP保存回图片
Metadata-Extractor主要负责读取元数据,保存修改需要结合它的写入工具类,配合xmp-core-dotnet的序列化能力完成。具体步骤:
- 将修改后的
IXmpMeta序列化为XMP数据包 - 使用
Metadata-Extractor的JpegMetadataEditor替换图片中的XMP数据
示例代码:
// 1. 序列化修改后的XMP元数据为数据包 XmpPacketWrapper xmpPacket = XmpMetaFactory.SerializeToPacket(xmp); byte[] xmpData = xmpPacket.GetBytes(); // 2. 打开原图片并写入修改后的XMP数据 using (var editor = JpegMetadataEditor.FromFile(pathToMyJpgImage)) { // 设置新的XMP数据 editor.SetXmpData(xmpData); // 保存到目标路径(可以覆盖原文件或指定新路径) editor.Save(outputImagePath); }
注意事项
- 如果是处理非JPG格式的图片(如PNG),需要使用对应格式的元数据写入工具,
Metadata-Extractor对常见格式都有支持 - 若需要覆盖原图片,请确保原文件未被占用
- 序列化XMP时,
XmpMetaFactory.SerializeToPacket会自动处理命名空间前缀映射,无需手动拼接格式
内容的提问来源于stack exchange,提问作者Vegetico
相关产品推荐
相关产品推荐

