Свойство изменения ImageMetadata повреждено - PullRequest
8 голосов
/ 17 июня 2019

У меня есть рабочее приложение для изменения некоторых метаданных отсканированных изображений. Это работало хорошо, пока мы не добавили предварительную обработку для автоматического кадрирования границ изображений с помощью консоли 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)

Пример проекта

1 Ответ

1 голос
/ 24 июня 2019

Метаданные - это иерархия, поэтому вы не можете писать все, используя только пути, вам придется использовать промежуточные BitmapMetadata объекты.

Официальная документация для всего этого находится здесь: NativeЗапросы метаданных формата изображения , являющиеся частью документации WIC или Windows Imaging Component , лежащей в основе технологии создания образов Windows, которую использует WPF.1011 *

/ ifd / iptc или / ifd / {ushort = 33723} / IPTC / VT_UNKNOWN - программа чтения / записи запросов

Непонятный VT_UNKNOWN (для «Вариант типа IUnknown») на самом делеозначает, что iptc - это объект , который может читать и записывать метаданные (иначе: BitmapMetadata на языке WPF), начало поддерева метаданных.

Итак, что выдолжен сделать что-то вроде этого:

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