Кодирование длины сегмента JPG - PullRequest
4 голосов
/ 02 апреля 2010

Я пытаюсь написать код для извлечения информации Exif из JPG.

Exif хранится в сегменте APP1 файла JPG. Согласно спецификации Exif формат сегмента APP1 должен начинаться следующим образом:

FF E1        // APP1 segment marker
nn nn        // Length of segment
45           // 'E'
78           // 'x'
69           // 'i'
66           // 'f'

И это продолжается до тех пор, пока за FF не последует что-то отличное от FF или 00.

Глядя на JPG в шестнадцатеричном редакторе, я вижу FF E1 и строку Exif, но у меня возникают проблемы с декодированием байтов длины. Пример: в одном jpg мой шестнадцатеричный редактор говорит мне, что сегмент APP1 имеет длину 686 байтов, но длина байтов F7 C8.

Как мне использовать эти байты, чтобы получить десятичное число 686?

Редактировать: Вот первая часть файла примера:

FF D8 FF E1 F7 C8 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08

Редактировать: На самом деле, я думаю, я мог бы знать, что здесь происходит. Действительно ли сегмент APP1 «содержит» другие сегменты? Например, если данные миниатюр считались находящимися внутри APP1, то эта длина представляется более разумной. Кто-нибудь может подтвердить / опровергнуть это?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2010

Оказывается, что сегмент APP1 включает миниатюру (см. Связанный документ EXIF ​​и прокрутите вниз до логической страницы 12), поэтому 686 - это красная сельдь (вероятно, число байтов до миниатюры). F7C8 - это фактическое количество байтов до сегмента DQT, и оно настолько большое, потому что содержит миниатюру.

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

Вы не можете. Эти байты не представляют 686, но байты длины предшествуют строке «Exif».

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

...