Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6322
Последний выпуск: 19.06.2015

JPG

ПРИМЕЧАНИЕ:

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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог