Предлагаю вам прочитать Exif Specification (PDF); это ясно и довольно легко следовать. Для краткого описания, вот краткое изложение статьи , которую я написал:
Файл JPEG / Exif начинается с начала маркера изображения (SOI). SOI состоит из двух магических байтов 0xFF 0xD8
, идентифицирующих файл как файл JPEG. После SOI существует несколько разделов маркеров приложений (APP0, APP1, APP2, APP3, ...), обычно содержащих метаданные.
Разделы маркеров приложения
Каждый раздел APPn начинается с маркера. Для раздела APP0 маркер 0xFF 0xE0
, для раздела APP1 0xFF 0xE1
и т. Д. За байтами маркера следуют два байта для размера раздела (исключая маркер, включая байты размера). Поле длины сопровождается данными приложения переменного размера. Разделы APPn являются последовательными, так что вы можете пропустить целые разделы (используя размер раздела), пока не достигнете того, который вас интересует. Содержимое разделов APPn варьируется, следующее для раздела Exif APP1 только .
Раздел Exif APP1
Exif метаданные хранятся в и разделе APP1 (может быть более одного раздела APP1). Данные приложения в разделе Exif APP1 состоят из маркера Exif 0x45 0x78 0x69 0x66 0x00 0x00
("Exif\0\0"
), заголовка TIFF и нескольких разделов каталога файлов изображений (IFD).
Заголовок TIFF
Заголовок TIFF содержит информацию о порядке байтов разделов IFD и указатель на 0-й IFD. Первые два байта равны 0x49 0x49
(II
для Intel), если порядок байтов имеет младший порядок байтов, или 0x4D 0x4D
(MM
для Motorola) для байтов с прямым порядком байтов. Следующие два байта являются магическими байтами 0x00 0x2A
(42
;)). И следующие четыре важных байта сообщат вам смещение к 0-му IFD от начала заголовка TIFF.
Важно: Сам файл JPEG (то, что вы читали до сих пор) всегда будет в формате с прямым порядком байтов. Однако порядок байтов подразделов IFD может отличаться, и его необходимо преобразовать (порядок байтов известен из заголовка TIFF выше).
Каталог файлов изображений
Как только вы доберетесь до этого места, у вас будет указатель на 0-й раздел IFD, и вы готовы прочитать фактические метаданные. Остальные IFD упоминаются в разных местах. Смещение к Exif IFD и GPS IFD указано в полях 0-го IFD. Смещение к первому IFD дается после 0-го поля IFD. Смещение для IFD совместимости дается в Exif IFD.
IFD - это просто последовательные записи полей метаданных. Количество полей указывается в первых двух байтах IFD. После подсчета полей находятся 12-байтовые поля. После полей имеется смещение в 4 байта от начала заголовка TIFF до начала первого IFD. Это значение имеет смысл только для 0-го IFD. После этого есть раздел данных IFD.
Поля IFD
Поля - это 12-байтовые подразделы разделов IFD. Первые два байта каждого поля дают идентификатор тега, как определено в стандарте Exif. Следующие два байта дают тип данных поля. У вас будет 1
для byte
, 2
для ascii
, 3
для short
(uint16
), 4
для long
(uint32
) и т. Д. Проверьте Exif Спецификация для полного списка.
Следующие четыре байта могут быть немного запутанными. Для байтовых массивов (ascii
и undefined types
) указана длина байта массива. Например, для строки Ascii: "Exif"
число будет равно 5, включая нулевой терминатор. Для других типов это количество компонентов поля (например, 4 коротких, 3 рациональных).
После подсчета у нас есть 4-байтовое значение поля. Однако, если длина данных поля превышает 4 байта, они будут храниться в разделе данных IFD. В этом случае это значение будет смещением от начала заголовка TIFF до начала данных поля. Например, для long
(uint32
, 4 байта) это будет значение поля. Для rational
(2 x uint32
, 8 байтов) это будет смещение к 8-байтовым полевым данным.
Это в основном то, как метаданные расположены в файле JPEG / Exif. Необходимо помнить несколько предостережений (не забывайте преобразовывать порядок байтов по мере необходимости, смещения начинаются с начала заголовка TIFF, переходите к разделам данных для чтения длинных полей, ...), но формат довольно легко читается. , Ниже приводится HEX-представление с цветовой кодировкой файла JPEG / Exif. Синий блок представляет SOI, оранжевый - заголовок TIFF, зеленый - размер IFD и байты смещения, светло-фиолетовые блоки - поля IFD, а темно-фиолетовые блоки - данные поля.
![HEX View of a JPEG/Exif File](https://i.stack.imgur.com/waINj.png)