Маркеры размера файлов JPEG, вставка байтов, метаданные IPTC - PullRequest
5 голосов
/ 23 мая 2011

Меня интересует ручная вставка полей IPTC в файл JPG на уровне байтов. Файл JPEG имеет несколько сегментов метаданных с респектабельными маркерами размера. Сегменты-контейнеры для IPTC:

App13 - начинается с FF ED XX XX ..

8BIM Текстовые метаданные IPTC - начинаются с 38 42 49 4D 04 04 00 00 00 00 XX XX ..

IPTC * Поле 1014 * начинается с 1C 02 50 XX XX .. (0x50 = 80, поле IPTC # 80).

(XX XX = 2 байта длинного слова, описывающего размер данных упомянутого сегмента).

Есть ли другие метки размера в файле JPEG и метаданные, на которые стоит обратить внимание? Нужно ли увеличивать их размер при добавлении сегмента метаданных с настраиваемыми полями IPTC?

Как добавить поле пользовательских метаданных (например, # 225), которое будет работать со всеми изображениями JPEG, которые уже содержат сегмент IPTC?

Работа в C #, но это вопрос об операциях с байтами, поэтому я думаю, что язык не имеет значения.

1 Ответ

2 голосов
/ 09 июня 2011

Так как никто не ответил, я объясню, что я сделал.

ad 1. Указанных выше маркеров файла достаточно для манипулирования IPTC.

ad 2. Во время манипуляции IPTC на уровне байтов вы можете легко повредить файл, если случайно удалите или перезапишите существующийбайты, особенно если это маркеры (заголовки некоторой части файла JPEG).

ad 3. Необходимо найти и увеличить App13 и соответствующие маркеры 8BIM и IPTC с длиной нового поля метаданных (размер контента +5 байтов для заголовка IPTC).Так, например, чтобы добавить новое поле # 09, вы должны найти сегмент 8BIM IPTC (38 42 49 4D 04 04 00 00 00 00 XX XX) и увеличить XX XX байтов с новым размером слова.Затем увеличьте размер обертки сегмента App13 (найдите последний сегмент FF ED XX XX до 8BIM) и, наконец, в конце 8BIM (вы знаете конец благодаря байту длины сегмента), просто добавьте новое поле IPTC, например, 1C 02 09 00 05 -добавляет поле метаданных # 09 длиной 5. Следующие 5 байт будут считаться содержимым поля = добавляемое вами слово.

Да, это немного хаотично, но работает: -)

...