图像元数据更改属性已损坏。

7
我有一个工作的应用程序,可以更改扫描图像的一些元数据。这个工作很好,直到我们添加了一个预处理来使用GIMP控制台自动裁剪图像的边框。
我们可以更改EXIF数据中的多个字段,这仍然是正确的。但如果我想更改任何IPTC字段,我会得到“属性已损坏”的错误。
对于未裁剪的图像,我可以更改EXIF和IPTC而没有任何问题。对于已裁剪的图像,我可以更改EXIF而没有任何问题。如果我在IPTC信息中更改任何内容,就会出现异常。
我做错了什么吗?或者是否有其他解决方案来更改图像的EXIF/IPTC数据?
如其他博客中所述,我从图像中提取BitmapMetadata。并且我克隆它以进行编辑。之后,我添加填充以便添加额外的信息。
据我所见,元数据看起来没有任何问题。在IrfanView或EXIFTool等其他工具中,我可以正确更改IPTC Headline。
我创建了一个测试项目来展示这个问题。附带有一个裁剪前后的示例图像。
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

系统参数异常:属性已损坏。 ---> 系统运行时互操作性COMException:位图属性大小无效。 (HRESULT: 0x88982F42)

示例项目

1个回答

1

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

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

对于TIFF,文档如下:

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

晦涩的VT_UNKNOWN(代表“变量类型IUnknown”)实际上意味着iptc是一个可以读取和写入元数据的对象(也称为WPF术语中的BitmapMetadata),是元数据子树的起点。

因此,您必须执行以下操作:

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

谢谢解释,但是图像已经包含了 iptc 数据。所以我将覆盖它。如果我尝试使用 GetQuery("/ifd/iptc"),我可以得到正确的值返回。所以如果我这样做,可能会覆盖其他 iptc 属性,并且失去信息。 - Stinus
2
@Stinus - 你必须以WIC/WPF读取元数据的方式创建元数据。这意味着你必须读取整个树(包含中间BitmapMetadata对象),并在更新或添加新值后重新编写它,保持中间对象树结构相同。如果你想使用Windows提供的内容,就没有其他方法了。 - Simon Mourier
你能修改我的示例应用程序以展示你的意思吗?你上面所做的是覆盖图像中的整个IPTC元数据。但我需要保留它。在我的测试项目中,第二张图片保存时会出现损坏错误。 - Stinus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接