Таблица 1. Начало файла JFIF.
Информация
SOI
APP0 Длина
Идентификатор
JFIF
Номер
версии
Ед.
Изм.
Плотность
пикселей
Возмо
жные
данные
превью
Номер байта
(десятичное)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 ...
Пример
значения
(шестнадцат.)
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 00 60 00 00
Первые два байта любого потока JPEG имеют значение маркера SOI (Start Of Image) - FF D8. Именно
этими двумя байтами начинается любой файл JFIF. Также однозначно, что любой поток, как и сам
файл заканчивается двумя байтами FF D9 - EOI (End Of Image). Таких потоков в файле может быть
несколько.
За маркером SOI сразу же следует маркер сегмента приложения APP0 (APPlication 0, т.е.
Приложение 0), представляющий собой два байта FF E0.
За ним следуют два байта длины (сначала старший байт, затем младший), которая представляет
собой полную длину поля APP0, включая длину самого поля "длина" (2 байта), но без длины маркера
APP0. В нашем случае это байты 00 10 или 16 в десятеричной системе (если значение меньше 16, то
этот сегмент не JFIF).
После мы видим пять байт, которые представляют буквы JFIF0, заканчивающиеся нулем, которые
идентифицируют файл, как JPG - 4A 46 49 46 00.
Следующие два байта имеют значение версии (всегда должно быть 01) и подверсии (от 0 до 2). В
нашем случае это 01 02.
Далее следуют следующие значения:
- Единицы измерения плотности (1 байт) (0 - безразмерный (коэффициент), 1 - точки на дюйм, 2 -
точки на сантиметр)
- Плотность пикселей по-горизонтали (2 байта)
- Плотность пикселей по-вертикали (2 байта)
Некоторые графические редакторы (например Photoshop) иногда вставляют в тело файла
уменьшенное графическое изображение картинки для быстрого получения пользователем
информации о содержимом файла (присутствуют только в версиях 1.02 и возможно выше). Но
реально большинство кодировщиков ее не используют. Однако следующие байты могут хранить
именно информацию об этих превьюшках:
- количество пикселов превью по-горизонтали (2 байта)
- количество пикселов превью по-вертикали (2 байта)
-
значения
RGB
пикселов
для
превьюшки
(3*количество
пикселов
превью
по-горизонтали*количество пикселов превью по-вертикали байт).
Однако в нашем случае файл превью не содержит, поэтому последние 2 байта поля APP0 содержат
нули. Однако очень часто уменьшенных графических изображений может быть несколько. Тогда
далее бы шли байты для второго уменьшенного графического изображения, а именно, еще бы одно
поле APP0, которое имело бы вид:
- маркер APP0 (2 байта)
- длина (2 байта)
- идентификатор JFIF0 (5 байт)
- код расширения (1 байт) - (10 - кодировка методом JPEG, 11 - 1 байт на пиксель, 12 - 3 байта на
пиксель)
Затем идет сжатое изображение превьюшки.
Размер поля APP0 не может превышать 64 kb (теоретически).
Будем рассматривать JFIF файл, как неожиданую последовательность сегментов. Каждый сегмент
начинается макером, состоящим из двух байт, первый из которого FF, а второй определяет тип
сегмента. Далее в двух байтах идет размер сегмента (причем, еще раз обрати внимание, порядок
считывания их прямой, а не как в файлах GIF или BMP) - сначала старший, потом младший байт. И
только по маркеру можно опредилить, что за сегмент находится в этой области файла. Обычно
поддерживаемые маркеры могут идентифицировать следующие сегменты:
Do'stlaringiz bilan baham: |