我有一个正在运行的应用程序,可以更改扫描图像的某些元数据。这一直很好,直到我们添加了预处理程序以使用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)
元数据是一个层次结构,因此您不能仅使用路径编写所有内容,您必须使用中间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)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |