Вопрос

Приветствую вас,

Я собираюсь получить информацию exif из некоторых изображений, используя Android.Я знаю, что есть несколько стандартных библиотек java, которые я мог бы использовать с этим устройством.Я уверен, что в конечном итоге воспользуюсь одним из них.

Но в то же время, может ли кто-нибудь объяснить мне, как эта информация кодируется внутри JPG?Где / как вы обычно получаете информацию из документа.Когда я открываю документ с помощью текстового редактора, он весь двоичный.

Любопытно, как это работает и как я потенциально мог бы прочитать данные, о которых идет речь.

Это было полезно?

Решение

Если вы ищете строку " Exif " вы найдете начало данных Exif - это довольно сложно, и я бы порекомендовал использовать библиотеку - (например, DotImage , если вы использовали .NET).

Вот описание высокого уровня:

Сам Exif находится внутри AppMarker - три байта перед ним будут E1 (AppMarker 1) и размер данных маркера в порядке байтов файла. Через два байта после Exif вы увидите маркер порядка байтов (например, 49 49 означает II , что означает Intel, младший порядок байтов - это означает, что 2-байтовые числа имеют младший байт первым в файле).

В остальной части данных широко используются смещения, смещение от местоположения первого байта байта (49 в приведенном выше случае)

8 байтов от этого смещения - это 2-байтовое число, которое является количеством тегов exif. Если вы находитесь в порядке следования байтов II , поменяйте местами байты, чтобы прочитать длину.

Тогда будет 12 записей байтов. Каждый из них:

2 bytes: Tag ID
2 bytes: Tag Type
4 bytes: Length
4 bytes: data if the data is 4 bytes or less, or an offset to the data

После N 12 байтовых записей у вас будут данные, на которые указывает каждое смещение, используемое в вышеуказанных N записях. Вам нужно найти идентификаторы и типы, чтобы увидеть, что они означают и как они представлены.

Другие советы

Я немного опоздал на вечеринку, но, написав Библиотека Java для обработки Exif (среди других типов метаданных) Я подумал, что стоит вмешаться.

Exif

Exif построен на РАЗМОЛВКА, формат файла изображения с тегами.Итак, сначала мы должны изучить TIFF:

  • Документ в формате TIFF содержит несколько каталоги известные как IFDs (Каталоги файлов изображений)
  • Каждый IFD содержит ноль или более Теги
  • IFD могут ссылаться на ноль или более других IFD
  • Каждый тег имеет числовой идентификатор и содержит ноль или более значений указанного типа данных

Представьте структуру в виде дерева с примитивными значениями на листьях.TIFF сам описывает свою структуру, но он ничего не диктует о том, какие значения на самом деле находятся на листьях подлый.

На самом деле вы можете хранить любые данные в формате TIFF, они не привязаны к изображениям.

Файл TIFF имеет общий заголовок:

  • 2 байта для упорядочения байтов, либо MM или II в формате ASCII.Это подскажет вам, в каком порядке сначала рассматривать все будущие байты в -- LSB или MSB.
  • 2 байта TIFF-маркер, для Exif это 0x002A
  • 4 байта указатель на первый IFD

МФД имеют столь же простую структуру:

  • 2 байта по количеству тегов, за которыми нужно следить
  • N байт для самих тегов (где N = 12 * Количество тегов)
  • 4 байта для необязательного указателя на следующий IFD (используйте нулевое значение, если IFD не связан)

Теги имеют простое представление в 12 байтах:

  • 2 байта для идентификатора тега
  • 2 байта для типа данных (int8u, int16s, float и т.д.)
  • 4 байта для количества значений данных указанного типа
  • 4 байта для самого значения, если оно подходит, в противном случае для указателя на другое местоположение, где могут быть найдены данные - это может быть указатель на начало другого IFD

Типы данных предопределены.Например:1 представляет 8-разрядные целые числа без знака, а 12 представляет 64-разрядные числа с плавающей запятой.

Итак, со всем этим вы можете идти дальше и следовать за файлом данных.Некоторые наблюдения:

  • Вы не можете прочитать данные по порядку, так как на них можно свободно ссылаться повсюду.Вы должны либо иметь произвольный доступ, либо синтезировать его путем буферизации.
  • Все, что вы знаете на данный момент, это то, что тег с идентификатором 0x1234 имеет 4 целых числа: {1,2,3,4}

Чтобы декодировать TIFF в Exif, вам необходимо применить словарь, который определяет, что представляет каждый IFD и что представляет каждый идентификатор тега в этих IFD.

JPEG

Большинство пользователей моей библиотеки обрабатывают файлы в формате JPEG.Файлы JPEG имеют совершенно иную структуру, состоящую из последовательности сегментов.Каждый сегмент имеет идентификатор и блок байтов.Exif находится в APP1 (числовое значение 0xe1) фрагмент файла JPEG.Как только у вас это получится, вы должны пропустить несколько начальных байтов (Exif\0\0) прежде чем увидеть MM или II которые обозначают начало данных Exif в формате TIFF.

Сведем все это воедино на примере

Вот двоичный дамп одной из моих библиотек примеры изображений:

По порядку:

Запускается формат JPEG

  • FF D8 является "магическим числом" JPEG.
  • FF отмечает начало сегмента JPEG.
  • E1 указывает тип сегмента JPEG (это APP1, где живет Exif).
  • 18 B3 (6,323 десятичных знака) дает длину сегмента (включая размер в байтах), поэтому мы знаем, что все данные Exif для этого файла JPG будут находиться в пределах следующих 6321 байт.Обратите внимание, что в JPG многобайтовые значения кодируются с использованием порядка Motorolla, хотя вложенные данные Exif могут использовать порядок Intel.
  • 45 78 69 66 00 00 или в формате ASCII Exif\0\0 это преамбула Exif. APP1 не восстанавливается исключительно для Exif, так что это дискриминирует.

Запускается TIFF / Exif

  • 4D 4D или MM указывает, что у нас есть порядок байтов Motorolla в этом блоке Exif
  • 00 2A это наш стандартный TIFF-маркер, как обсуждалось выше
  • 00 00 00 08 является смещением (8 байт) к первому IFD относительно заголовка TIFF (MM в данном случае).В данном случае это указывает непосредственно на следующий байт в последовательности, хотя в этом нет необходимости.

Начинается IFD

  • 00 08 открывает наш первый IFD и сообщает, что скоро у нас будет 8 тегов

Запуск тега

  • 01 0F является идентификатором для первого тега в первом IFD, в данном случае производителя камеры
  • 00 02 является типом значения (2 означает, что это строка ASCII).
  • 00 00 00 16 это количество компонентов, означающее, что у нас будет 22-байтовая строка
  • 00 00 01 B2 (434 десятичных знака) является указателем на местоположение этой строки относительно заголовка TIFF (MM).Вы не можете видеть это на этом скриншоте, но это указывает на 45 41 53 54 4D 41 4E 20 4B 4F 44 41 4B 20 43 4F 4D 50 41 4E 59 00 который является EASTMAN KODAK COMPANY в формате ASCII

НЕОБРАБОТАННЫЙ

Файлы Camera raw (CR2 / NEF / ORW ...) обычно используют формат TIFF, однако в основном они используют теги, отличные от тегов Exif.Вторая пара байтов в этих файлах будет отличаться от 00 2A кроме того, указывается тип словаря TIFF, который следует применять.

Википедия содержит несколько указаний на то, как и где именно данные EXIF хранятся в файле.Конечно, всегда есть стандартный самому дочитать.

Это одна из хороших библиотек для Java и EXIF: http://www.drewnoakes.com/code/exif/

Анализировать EXIF-данные довольно утомительно, но вы можете найти много библиотек для их анализа. Мой любимый для Java,

http://www.java2s.com/Open-Source/Java-Document/Web-Server/Jigsaw/org/w3c/tools/jpeg/Exif.java.htm

http://jigsaw.w3.org/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top