ImageMetadata更改属性已损坏

时间:2019-06-17 09:22:04

标签: .net exif iptc

我有一个正在运行的应用程序,可以更改扫描图像的某些元数据。效果很好,直到我们添加了一个预处理程序以使用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)

Example project

1 个答案:

答案 0 :(得分:1)

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

所有这些的官方文档位于:Native Image Format Metadata Queries,属于WIC or Windows Imaging Component文档的一部分,Cython annotation文档是WPF使用的基础Windows映像技术。

医生对TIFF说了这样的话:

  

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

晦涩的VT_UNKNOWN(对于“ Variant Type IUnknown”而言)实际上意味着iptc是可以读写元数据(又称WPF中的BitmapMetadata)的对象说法),元数据子树的开始。

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

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