CodeNet / Приложения / Алгоритмы / Сжатие и кодирование / JPG
CodeNet / Приложения / Графика / Форматы файлов / JPG
CodeNet / Остальное / Форматы файлов / JPG
JPG
- Короткое объяснение некоторых важных маркеров, содержащихся в файле JPG.
- Таблица Хаффмана, сохраненная в файле JPG
- JFIF (Jpeg Формат Взаимозаменяемого Файла) файл
- Показатели (факторы) дискретизации
- Краткая схема декодирования файла JPG
- Техническое объяснение JPEG/JFIF файлового формата
ПРИМЕЧАНИЕ:
JPEG/JFIF файловый формат использует формат Motorola для целых (двухбайтовых) значений, НЕ формат Intel, то есть: сначала старший байт, затем - младший (например: двухбайтовое целое значение FFA0 будет записано в JPEG файле в порядке: FF в младшем смещении, A0 в старшем смещении)
Стандарт JPG определяет, что JPEG файл сформирован в основном из частей, названных "сегментами". Сегмент является потоком байтов с длиной <= 65535. Сегментное начало определяется маркером. Маркер = 2 байта, начиная с 0xFF (C-шестнадцатеричная запись для 255), и заканчивая байтом, отличным от 0 и 0xFF. Например: 'FFDA', 'FFC4', 'FFC0'. Каждый маркер имеет значение: второй байт (отличный от 0 и 0xFF) определяет функцию этого маркера. Например, есть маркер, который определяет, что Вы должны запускать декодирование процесса, это обозначается (стандартная терминология JPG): SOS = Начало Сканирования = 'FFDA'
Другой маркер, названный DQT = Определение Таблицы Квантования = 0xFFDB, определяет, что в файле JPG, после маркера (и после 3 байтов, дополнительно об этом позже) следуют 64 байта = коэффициенты таблицы квантования.
Если, в течение обработки файла JPG, Вы встречаете 0xFF, затем снова байт, отличный от 0 (Я сообщил Вам, что второй байт маркера - не 0) и этот байт не имеет значение маркера (Вы не можете найти маркер, соответствующий этому байту), тогда байт 0xFF, который Вы встретили, должен игнорироваться и пропускаться. (В некоторых JPG-файлах, последовательности последовательных 0xFF - для некоторого заполнения и должны пропускаться)
Вы видите, что всякий раз, когда Вы встречаете 0xFF, Вы проверяете следующий байт и смотрите, имеет ли значение маркера или должно быть пропущено. Что случается, если нам действительно нужно кодировать байт 0xFF в файле JPG как *обычный* байт (не маркер или заполнение)? (Допустим, что нам нужно писать код Хаффмана, который начинается с 11111111 (8 битов 1) на перестановке байтов) Стандарт сообщает, что мы просто делаем следующий байт 0, и пишем последовательность 'FF00' в файл JPG. Так, когда Ваш дешифратор JPG встречает 2-байтовую последовательность 'FF00', он должен рассмотреть ее как обычный байт 0xFF.
Другая вещь: Вы понимаете, что эти маркеры являются выровненными по байту в файле JPG. Что случается, если в течение вашего кодирования Хаффмана и, включая биты в файловых байтах JPG, Вы не завершили включать биты в байт, но Вам нужно писать маркер, который является выровненным по байту? Для перестановки байтов маркеров, Вы УСТАНАВЛИВАЕТЕ ОСТАЛЬНЫЕ БИТЫ ДО НАЧАЛА СЛЕДУЮЩЕГО БАЙТА НА 1, тогда Вы пишите маркер в следующем байте.
Короткое объяснение некоторых важных маркеров, содержащихся в файле JPG.
SOI = Начало Изображения = 'FFD8'
Этот маркер должен присутствовать в любом файле JPG *однажды* в начале файла. (Любой файл JPG начинается с последовательности FFD8.)
EOI = Конец Изображения = 'FFD9'
Подобно EOI: любой файл JPG заканчивается на FFD9.
RSTi = FFDi (где i - значения 0..7) [RST0 = FFD0, RST7=FFD7] - Маркеры Перезапуска
Эти маркеры перезапуска используются для синхронизации. В регулярных интервалах, они появляются в потоке JPG байтов, в течение декодирования процесса (после SOS) (Они появляются в порядке: RST0 - интервал - RST1 - интервал - RST2 -...- RST6 - интервал - RST7 - интервал - RST0 -...)
(Замечание: Большинство JPG-файлов не имеет маркеров перезапуска)
Проблема с этими маркерами – в том, что они прерывают нормальный битовый порядок в Хаффман-кодированном битовом потоке JPG. Запомните, что для байтового выравнивания маркеров остальные биты устанавливаются на 1, так что Ваш дешифратор должен пропустить в регулярные интервалы бесполезные биты заполнения (установленные в 1) и маркеры RST.
Маркеры...
В конце этого документа, я включил очень хорошее письменное техническое объяснение JPEG/JFIF файлового формата, записанное Oliver Fromme, автором QPEG-просмотрщика. Там Вы найдете довольно хорошее и полное определение для маркеров.
Но, во всяком случае, здесь - список маркеров, которые Вы должны проверять:
- SOF0 = Начало Кадра 0 = FFC0
- SOS = Начало Сканирования = FFDA
- APP0 = маркер для идентификации файла JPG, который использует JFIF спецификацию
- FFE0
- COM = Комментарий = FFFE
- DNL = Определение Количество Строк = FFDC
- DRI = Определение Интервала Перезапуска = FFDD
- DQT = Определение Таблицы Квантования = FFDB
- DHT = Определение Таблицы Хаффмана = FFC4