2009-10-14 4 views
0

Мне нужно связать дату и имя с некоторыми jpeg, которые я включаю в свой пакет, или, возможно, загружать с моего собственного сервера в папку «Документы». Есть ли способ извлечь данные EXIF ​​легко?Как получить данные EXIF ​​из моих jpeg?

Если да, то я буду использовать EXIF ​​для хранения этой информации. Если нет, тогда мне придется создать базу данных или плоский файл, который отображает мои дополнительные данные в файл изображения.

Имейте в виду, что это не фотографии, которые iPhone сделал и предоставляет через UIImagePicker или снаружи песочницу. Это фотографии, которые я включаю в приложение или загрузку в папку Docs. Важным моментом здесь является простота:

Это проще

  • EXIF-файл для чтения из моих файлов изображений
  • есть другой файл, который отслеживает файл изображения и связанные с ним данных (может быть sqlite)

Спасибо!

ответ

3

Вы можете использовать iphone-exif toolkit для извлечения данных. Тем не менее, это лицензированный GPL, и если ваше приложение является коммерческим, вам необходимо договориться о сделке с лицензией. Если это нецелесообразно, вы можете пойти по внешнему маршруту метаданных.

+0

Написал ли это с нуля, как хлопот? Похоже на это. Внешний маршрут не так уж плох, но я хотел бы иметь один файл, который является автономным, а не базу данных, связывающую кучу файлов, или пару файлов (img и meta-data) ... – mahboudz

+0

Другой вариант - начать с другой кодовой базы и передать ее поверх - возможно, что-то вроде libexif [http://libexif.sourceforge.net/]. – Ramin

+0

Только если ваше приложение является коммерческим, а не открытым исходным кодом. У вас может быть коммерческое приложение с открытым исходным кодом. –

2

Фактические данные EXIF хранятся в виде небольшого файла TIFF с тегами TIFF, специфичными для EXIF, для информации, которая не имеет дома в спецификации TIFF. При размещении в файле JPEG (на самом деле битовый поток JFIF) он хранится в маркере APP1 JPEG, который ограничивает общий размер данных EXIF ​​всего чуть меньше 64 КБ.

Не должно быть трудно найти маркер APP1, подтвердить, что он содержит данные EXIF, а затем разобрать конкретную коллекцию тегов EXIF ​​с довольно грубым кодированием.

Один пример, который вы можете посмотреть, - это exiftool, который делает именно это и написан на Perl и с открытым исходным кодом на тех же условиях, что и сам Perl.

1

Если эти файлы предназначены исключительно для использования в вашем собственном приложении и не будут повторно использоваться в других инструментах пользователем, то есть пробег в хранении ваших данных в формате XML/JSON в сегменте комментариев 0xFFFE. Как уже упоминалось, до игры вам не хватает 64k.

Красота использования сегмента комментариев заключается в том, что он должен быть сохранен средствами редактирования изображений, быстро доступен (поскольку вам не нужно проходить блоки IFD, хранящие данные EXIF, вы просто читаете/записываете текстовую строку с 4 байтовым типом/длиной заголовка) и читается человеком/записывается в графическом приложении.

Я бы не захотел хранить связанные данные в db, если это практично, так что вы не рискуете, что db перестает синхронизироваться с доступными файлами.

+0

. Мне нужно будет изучить это. У меня нет опыта работы с JSON. На iPhone, как вы получаете доступ к сегменту комментариев? Прочитайте файл как данные, а затем? – mahboudz

+0

Это должно помочь http://en.wikipedia.org/wiki/JPEG#Syntax_and_structure Файлы Jpeg создаются из серии из нескольких блоков/сегментов. Каждый блок начинается с 2-байтового типа блока, который в некоторых случаях сопровождается 2-байтным целым числом, задающим размер блока и некоторые данные. – Simon

+0

Что вы хотите сделать: 1) Читайте в 2 байтах, чтобы узнать, что такое тип блока: 2) Если тип блока - это тот, у которого есть связанные данные, прочитайте еще 2 байта как целое число. Затем пропустите это количество байтов. 3) Повторяйте шаги 1 и 2, пока не прочитаете тип блока 0xFFFE (сегмент комментариев). 4) Читайте в 2-байтовой длине. Загрузите это количество байтов в строковый буфер. Что вы в итоге получаете - это всего лишь текстовая строка в любом формате. Вам не нужно использовать строгий JSON, но строку, такую ​​как «Name = Bob; Gender = M; Color = Red;» легко декодируется с использованием компонентов NSStringSeparatedByString: – Simon

Смежные вопросы