Кодирование JPEG

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 00:40, 25 мая 2017.

Формат JPEG (Joint Photographic Experts Group) представляет собой файловую форму представления сжатых изображений с потерями, а потому имеет большое распространение при работе с ЦФА. Метод сжатия JPEG-файлов стандартизован документом ISO/IEC IS 10 918. В этом методе сжатия используют пространственную корреляцию сигналов отдельных пикселей изображения, а также некоторые свойства зрительного анализатора. Несмотря на то, что JPEG-формат имеет множество опций кодирования и сжатия, можно выделить следующие этапы, поддерживаемые практически всеми реализациями:

  • преобразование изображения RGB в пространство яркостного и цветоразностных сигналов Y, Cr, Cb;
  • субдискретизация; кодирование сигналов цветности не требуется проводить в полном разрешении, и часть из них может быть либо пропущена, либо произведено усреднение;
  • дискретное спектральное преобразование ДСП;
  • квантование результатов ДСП, при которой вносятся потери;
  • сжатие модифицированным методом Хаффмана, либо арифметическим кодированием (статистическое сокращение –избыточности).

Подобная процедура сжатия приводит к тому, что JPEG-файл оказывается состоящим из отдельных блоков (сегментов). Каждый сегмент в зависимости от типа хранящейся в нем информации имеет свой заголовок, состоящий из 2-х байтов. При этом первый байт всегда hFF, значение второго – строго регламентировано типом сегмента. Кроме того, любой JPEG-файл всегда начинается с маркера hFFD8, а заканчивается hFFD9. Для того, чтобы осуществить кодировку определенного сегмента, логический блок модуля кодирования должен все время осуществлять поиск начала маркера hFF и анализировать следующий вслед за ним байт. В общем виде сегмент имеет следующий формат:

  1. Заголовок (4 байта):
    • hFF – идентифицирует сегмент;
    • hnn – тип сегмента (1 байт);
    • sh, sl – размер сегмента, включая эти два байта, но не включая hFF и байт типа сегмента; всегда сначала следует старший байт, затем младший;
  2. Содержимое сегмента, максимум 65533 байта.

Необходимо отметить, что есть сегменты без параметров (обозначаемые «*»), которые не имеют спецификацию размера и не имеют никакого содержания. Кроме того, любое число hFF байтов между сегментами легально и должно быть пропущено. Вычисляя начала соответствующего сегмента и изменяя либо его заголовок, либо его содержимое по определенному закону, можно обеспечить кодирование заложенной в JPEG-файл информации.

Алгоритм кодирования, основывается на поиске маркеров начала кадров hFF00 и их замене на игнорируемые маркеры, например hFFCC. Поскольку остальные сегменты файла остаются незакодированными, операционные системы как персонального компьютера, так и ЦФА воспринимают файл как файл с неискаженными параметрами, вследствие чего сбоя в работе ОС не происходит. При попытке же открыть файл для просмотра ОС всех вычислительных средств выдают сообщение об ошибке файла, а ОС и программы-просмотровщики персонального компьютера показывают «пустой» файл без изображения. Необходимо отметить, что содержимое сегментов с измененными маркерами остается в исходном виде, что обеспечивает полное восстановление закодированной информации либо с помощью аналогичного алгоритма кодирования, осуществляющей обратную подмену вида hFFCC -> hFF00, либо с помощью программы AXE, осуществляющей просмотр и редактирование закодированного файла.