7

我有一个工作应用程序来更改我扫描图像的一些元数据。这工作得很好,直到我们添加了一个预处理来使用 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

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

示例项目

4

1 回答 1

1

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

所有这一切的官方文档都位于此处:Native Image Format Metadata Queries,它是WIC 或 Windows 映像组件文档的一部分,WPF 使用的底层 Windows 映像技术。

文档对 TIFF 这么说:

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

晦涩难懂的 VT_UNKNOWN(表示“Variant Type IUnknown”)实际上iptc是一个可以读取和写入元数据的对象BitmapMetadata(也就是WPF 用语中的一个),是元数据子树的开始。

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

Dim iptc As BitmapMetadata = New BitmapMetadata("iptc")
iptc.SetQuery("/{str=Headline}", "TEST_HEADLINE")
oMetaData.SetQuery("/ifd/iptc", iptc)
于 2019-06-24T19:09:50.883 回答