2015-09-10 5 views
2

Я работаю над программой просмотра фотографий. В этом контексте я написал небольшой класс, чтобы читать и использовать некоторые данные EXIF, например. ориентация изображения. Этот класс хорошо работает для чтения.EXIF ​​и миниатюры

Однако, я бы добавил новый вариант для поворота фотографий. Я хочу повернуть и написать сами фотоданные, а не просто переписать тег ориентации. Я уже написал код для поворота и сохранения основного изображения в формате JPEG, и он работает хорошо. Но мне также нужно повернуть миниатюру, содержащуюся в данных EXIF, если таковые имеются, чтобы сохранить изображение согласованным. По этой причине мне нужно записать данные EXIF, чтобы заменить существующий эскиз.

Но это вызывает некоторые вопросы, которые я некоторые проблемы отвечая, а именно:

  • Может данные EXIF ​​содержит более 1 миниатюру, и если да, то рассчитывать максимальный эскиз, что изображение может содержат?
  • Какие поддерживаемые форматы для эскизов? (Я нашел JPEG и TIFF, есть ли другие?)
  • Есть ли какая-либо гарантия в стандартах EXIF, что миниатюры всегда записываются в конце данных EXIF, непосредственно перед основным изображением?
  • Если нет, то теги, содержащие смещение, указывающее на место за пределами уменьшенного изображения, должны быть обновлены. Итак, существует ли стандартный способ повторения всех тегов и подкаталогов, чтобы распознавать, какие теги EXIF ​​содержат смещения, и, если необходимо, обновлять их? Или единственный способ прочитать максимум тегов и переписать только те, которые известны?
  • Или есть способ гарантировать, что размер недавно повернутого миниатюры будет меньше или равен предыдущему размеру эскиза для замены?

С уважением

ответ

4

Вот некоторые ответы на вопросы:

1) Данные EXIF ​​выложена как TIFF файла с 2-х страниц. Первая страница - информация о камере, а вторая - миниатюра. Если вы добавите больше страниц (с эскизами), 99,99% приложений, вероятно, не заметят, так как вы будете делать это иначе, чем «стандартный» способ. Что касается «максимального количества», у вас есть 64 тыс. Данных, которые могут быть сохранены в любом теге JFIF. Вы можете поместить то, что хотите, в 64k.

2) Существует только один поддерживаемый формат уменьшенных изображений EXIF: TIFF. Внутри TIFF могут быть сжаты (JPEG) или несжатые данные. Опять же, вы можете хранить данные, сжатые LZW, но большинство приложений, вероятно, не будут готовы отображать их правильно.

3) Формат контейнера JFIF позволяет показывать метки с метаданными перед основным изображением. Теги APPx содержат метаданные, которые могут следовать стандарту или нет. Вы можете вставлять несколько тегов EXIF ​​APP1 в свои файлы, но, опять же, большинство приложений не смогут правильно обработать эту ситуацию. Таким образом, простой ответ заключается в том, что данные EXIF ​​(включая миниатюру) должны появляться перед основным изображением, и если вы помещаете более 1 миниатюры, это, скорее всего, будет проигнорировано.

4) Если вы изменяете JFIF (включая метаданные), вы должны переписать метаданные. На самом деле это довольно просто, потому что каждый тег является независимым и имеет простое значение длины вместо относительных смещений.

5) Вы можете делать все, что хотите, с размером или ориентацией вашего миниатюры до тех пор, пока общий размер данных тега EXIF ​​APP1 не будет соответствовать 64k.

Вот что вам нужно сделать ...

1) Прочитайте исходное изображение (и эскиз, если он присутствует).
2) Подготовьте свое повернутое изображение (и уменьшенное изображение).
3) Напишите новые метаданные с новым уменьшенным изображением.
4) Напишите новое основное изображение.

Если вы хотите сохранить оригинальные метаданные вместе с вашим новым эскизом, это довольно просто. Просто прочитайте оригинальные теги и держитесь за них, а затем напишите их на новом изображении. Каждый тег JFIF является всего 2 байтовым идентификатором (FFxx), за которым следует длина 2 байта, а затем данные. Они могут быть упакованы практически в любом порядке, и нет жесткого ограничения на то, сколько общих тегов может появиться перед основным изображением.

+0

См. Также: http://www.exif.org/Exif2-2.PDF. Обратите внимание, что согласно спецификации первый маркер APPn должен быть маркером APP1/Exif. Хотя принято считать, что первый APPn является маркером APP0/JFIF для совместимости с JFIF. Может быть только один маркер APP1/Exif и только один миниатюра (в IFD1). Эскиз может быть несжатым (RGB или YCbCr) или JPEG (хотя я никогда не видел нисходящую миниатюру YCbCr), а не LZW или другой. И строго, формат контейнера - JIF (не JFIF), но это ничто. В противном случае, отличный ответ. :-) – haraldK

+1

@haraldK спасибо за ссылку doc. Мой вопрос об упоминании LZW заключался в том, что он хочет что-то сделать вне стандарта, поэтому, если он не будет следовать стандарту, он может поместить любые данные, которые он хочет. – BitBank