我有一个正在运行的应用程序,可以更改扫描图像的某些元数据。效果很好,直到我们添加了一个预处理程序以使用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)
答案 0 :(得分:1)
元数据是一个层次结构,因此您不能仅使用路径来编写所有内容,而必须使用中间的BitmapMetadata
对象。
所有这些的官方文档位于:Native Image Format Metadata Queries,属于WIC or Windows Imaging Component文档的一部分,文档是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)