Сохраните метаданные файла в дополнительном файле - PullRequest
4 голосов
/ 02 апреля 2011

У меня есть куча файлов изображений (в основном .jpg). Я хотел бы хранить метаданные об этих файлах (например, доминирующий цвет, распределение цвета, поле максимального градиентного потока, точки интереса, ...). Эти поля данных не являются фиксированными и доступны не для всех изображений.

Сейчас я храню метаданные для каждого файла в виде отдельного файла с тем же именем, но с другим расширением. Формат просто текстовый:

metadataFieldName1 metadataFieldValue1
metadataFieldName2 metadataFieldValue2

Меня удивляет, есть ли лучший / более простой способ хранения этих метаданных? Я подумал о ProtocolBuffer, так как мне нужно иметь возможность читать и записывать эту информацию на C ++ и Python. Но как мне поддержать случай, когда некоторые метаданные недоступны?

Ответы [ 4 ]

2 голосов
/ 02 апреля 2011

Я бы посоветовал вам хранить такие метаданные в самих файлах изображений.

Большинство форматов изображений поддерживают хранение метаданных. Я думаю, что .jpeg поддерживает его через Exif .

Если вы работаете в Windows, вы можете использовать WIC для хранения и извлечения метаданных унифицированным .

1 голос
/ 02 апреля 2011

Почему буферы протокола, а не файлы XML или INI или какой-либо другой формат текста? Просто выберите какой-нибудь формат ...

А что вы имеете в виду под "недоступными метаданными"? Ваше приложение должно реагировать на такие ошибки ... как это связано с форматом хранилища?

0 голосов
/ 03 апреля 2011

Я долго думал над этим вопросом и пошел с ProtocolBuffer, чтобы хранить метаданные для моих изображений.Для каждого изображения, например, Image00012.jpg, я сохраняю метаданные в Image00012.jpg.pbmd.После того, как я настрою файл .proto, класс Python и класс C ++ генерируются автоматически.Он работает очень хорошо и требует от меня тратить немного времени на разбор (явно лучше, чем на написание пользовательского ридера для файлов YAML).

RestRisiko поднимает вопрос о том, как мне следует обрабатывать недоступные метаданные.Хорошая вещь о ProtocolBuffer - он поддерживает необязательные / обязательные поля.Это решает мою проблему в этом направлении.

Причина, по которой я считаю, что XML и INI не подходят для этой цели, заключается в том, что многие из моих метаданных являются сложными (распределение цвета, ...) и требуют небольшой настройки хранилища.,ProtocolBuffer позволяет мне вложить декларацию прото.Кроме того, размер файла метаданных и скорость синтаксического анализа явно превосходят мои возможности чтения / записи XML в ручном режиме.

0 голосов
/ 02 апреля 2011

Посмотрите на http://www.yaml.org. YAML менее многословен, чем XML, и более удобен для чтения.

Есть библиотеки YAML для C ++, Python и многих других языков.

Пример:

import yaml

data = { "field1" : "value1",
         "field2" : "value2" }

serializedData = yaml.dump(data, default_flow_style=False)

open("datafile", "w").write(serializedData)
...