2010-04-02 2 views
3

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

Exif хранится в сегменте APP1 файла JPG. Согласно the Exif spec, формат сегмента 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 десятичных чисел?

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

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

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

+1

Вы уверены, что сегмент APP1 не 63432 байта? Откуда вы знаете, что это 686? Это, вероятно, 686 плюс размер миниатюры. – Gabe

+0

@gabe Я искал следующие байты маркеров 'FF xx' нового сегмента. Это верно? – Blorgbeard

+0

Да, я бы ожидал, что FFDB станет следующим маркером (DQT). – Gabe

ответ

3

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

1

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

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

+0

Сделано, пожалуйста, взгляните на мои правки. – Blorgbeard

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