ImageMetadata更改属性已损坏

Sti*_*nus 8 .net iptc exif

我有一个正在运行的应用程序,可以更改扫描图像的某些元数据。这一直很好,直到我们添加了预处理程序以使用GIMP控制台自动裁剪图像的边框。

我们更改了EXIF数据中的多个字段,但这仍然可以正常工作。但是,如果我想更改任何IPTC字段,则会收到错误“属性已损坏”。

对于非裁剪图像,我可以毫无问题地更改EXIF和IPTC。对于裁剪后的图像,我可以毫无问题地更改EXIF。如果我更改了IPTC信息中的任何内容,则会出现异常。

难道我做错了什么?还是在如何更改图像的EXIF / IPTC数据上还有其他解决方案?

正如在其他帖子中所发现的,我从图像中提取了BitmapMetadata。然后我将其克隆,使其可编辑。之后,我添加了填充以能够添加额外的信息。

据我所知,元数据看起来没有错。在其他工具(如IrfanView或EXIFTool)中,我可以正确更改IPTC标题。

我创建了一个显示问题的测试项目。包含裁剪前后的示例图像。

If isJpg Then
    oMetaData.SetQuery("/app13/{ushort=0}/{ulonglong=61857348781060}/iptc/{str=Headline}", "TEST_HEADLINE")
Else
    oMetaData.SetQuery("/ifd/{ushort=33723}/{str=Headline}", "TEST_HEADLINE")
End If
Run Code Online (Sandbox Code Playgroud)

System.ArgumentException:属性已损坏。---> System.Runtime.InteropServices.COMException:位图属性大小无效。(来自HRESULT的异常:0x88982F42)

示例项目

Sim*_*ier 1

元数据是一个层次结构,因此您不能仅使用路径编写所有内容,您必须使用中间BitmapMetadata对象。

所有这些的官方文档位于此处:本机图像格式元数据查询,它是WIC 或 Windows 成像组件文档(WPF 使用的底层 Windows 成像技术)的一部分。

医生对 TIFF 是这样说的:

/ifd/iptc 或 /ifd/{ushort=33723} / IPTC / VT_UNKNOWN - 查询读取器/写入器

晦涩难懂的 VT_UNKNOWN(“Variant Type IUnknown”)实际上意味着iptc一个可以读取和写入元数据的对象BitmapMetadata(又名: WPF 术语中的 a),元数据子树的开始。

所以你必须做的是这样的:

Dim iptc As BitmapMetadata = New BitmapMetadata("iptc")
iptc.SetQuery("/{str=Headline}", "TEST_HEADLINE")
oMetaData.SetQuery("/ifd/iptc", iptc)
Run Code Online (Sandbox Code Playgroud)

  • @Stinus - 您必须以与 WIC/WPF 读取元数据相同的方式创建元数据。这意味着您必须读取整个树(包含中间 BitmapMetadata 对象),并在更新或添加新值后重写它,保持中间对象树结构相同。如果您想使用 Windows 提供的功能,就没有办法解决这个问题。 (2认同)