.net - ImageMetadata 更改属性已损坏

标签 .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

最佳答案

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

所有这些的官方文档位于:Native Image Format Metadata Queries这是 WIC or Windows Imaging Component 的一部分文档,WPF 使用的底层 Windows 成像技术。

文档对 TIFF 是这样说的:

/ifd/iptc or /ifd/{ushort=33723} / IPTC / VT_UNKNOWN - A query reader/writer



晦涩难懂的 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)

关于.net - ImageMetadata 更改属性已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56628370/

相关文章:

.net-core - 如何使用 ImageSharp 清除图像的 EXIF 数据?

php - XAMPP + Perl + PHP。不知道如何运行 Perl 脚本

ruby-on-rails - 用于从 JPEG 中提取 IPTC 数据的 Ruby gem

python - 是否有任何 Python3 兼容模块来读取/写入 IPTC 数据?

.net - Microsoft.Practices.ServiceLocation 从哪里来?

c# - 使用 oledb 的参数化 oracle 查询

java - 使用 java commons-imaging 访问 jpeg 标签

c - 执行 iptables 代码时出错 “Error commit: Protocol wrong type for socket”

.net - 当我有表单事件时,为什么要使用 WndProc?

.net - Entity Framework ——实体映射问题