【问题标题】:ImageMetadata change property is corruptedImageMetadata 更改属性已损坏
【发布时间】:2019-10-30 20:58:15
【问题描述】:

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

【问题讨论】:

    标签: .net exif iptc


    【解决方案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)
    

    【讨论】:

    • 感谢您的解释,但是图像已经包含一个iptc数据。所以我会覆盖它。如果我尝试 GetQuery("/ifd/iptc"),我会得到正确的返回值。因此,如果我执行上述操作,我可能会覆盖其他 iptc 属性,并丢失信息。
    • @Stinus - 您必须以与 WIC/WPF 读取元数据相同的方式创建元数据。这意味着您必须读取整个树(包含中间 BitmapMetadata 对象),并在更新或添加新值后重写它,保持中间对象树结构相同。如果您想使用 Windows 提供的功能,则无法解决此问题。
    • 您能否修改我的示例应用程序以显示您的意思?您在上面所做的是覆盖图像中的整个 IPTC 元数据。但我需要保存它。我的测试项目中的第二张图片在保存时出现损坏的错误。
    猜你喜欢
    • 2011-07-11
    • 2021-01-04
    • 1970-01-01
    • 2014-03-14
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多