JPEG File Interchange Format

Также известен как: JFIF, JFI, JPG, JPEG


Тип Растровый
Цвета До 24-бит
Сжатие JPEG
Максимальный размер изображения 64K x 64K пикселей
Формат чисел "Старший в младшем"
Больше одного изображения в файле Нет
Разработчик C-Cube Microsystems
Платформы Все
Поддерживается приложениями Их слишком много, чтобы перечислять
См. также Главу 9, Сжатие данных, раздел JPEG.

Применение
Используется преимущественно в программах обработки графики и изображений.

Комментарии
Один из немногих форматов, использующих метод сжатия JPEG и позволяющих обрабатывать и превосходно сжимать полноцветные изображения.

Имеются спецификации для этого формата.

Имеются исходники для этого формата.


Обзор

Под аббревиатурой JPEG (Joint Photographic Experts Group) подразумевается организация-разработчик стандарта, метод сжатия, а также формат файла. Фактически, спецификация формата JPEG, описанная в 9 главе, не определяет общего способа для хранения и обмена JPEG-данных между разными платформами и операционными системами. Формат JPEG File Interchange Format (JFIF) - разработка корпорации C-Cube Microsystems для хранения данных, кодированных в JPEG. JFIF-формат предназначен для обмена JPEG-кодированных данных между разными несовместимыми системами и приложениями.

Содержание:
Организация файла
Подробное описание файла
Дополнительная информация

Организация файла

И JPEG, и JFIF - данные представляют собой поток байтов, хранящих в себе 16- битовое слово в формате "страший в младшем". Обычно JPEG-данные записываются в виде потока блоков, каждый из которых идентифицируется значением маркера.

Первые 2 байта любого JPEG-потока хранят значение маркера "Start Of Image" (SOI) - FFh D8h. В файле JFIF формата есть маркер "JFIF APP0" (приложение), следующий за SOI и состоящий из значения кода маркера FFh E0h и символов JFIF в маркерах данных. В дополнение к сегменту маркера JFIF могут также присутствовать один или больше сегментов маркеров JFIF-расширений, за которыми следует реальные графические данные.

Подробное описание файла

Хотя заголовок JFIF-файла формально не определён, маркеры SOI и JFIF APP0, взятые вместе, могут рассматриваться в качестве заголовка:

typedef struct _JFIFHeader
{
  byte SOI[2];          /* 00h  "Start of Image" маркер        */
  byte APP0[2];         /* 02h  Маркер приложения              */
  byte Length[2];       /* 04h  Длина сегмента APP0.           */
  byte Identifier[5];   /* 06h  Идентификационная строка "JFIF", заканчивающаяся нулём */
  byte Version[2];      /* 07h  Версия JFIF                    */
  byte Units;           /* 09h  Единица измерения разрешения   */
  byte Xdensity[2];     /* 0Ah  Горизонтальное разрешение      */
  byte Ydensity[2];     /* 0Ch  Вертикальное разрешение        */
  byte XThumbnail;      /* 0Eh  Кол-во пикселей по горизонтали */
  byte YThumbnail;      /* 0Fh  Кол-во пикселей по вертикали   */
} jfifhead;

Поле SOI - это маркер Начала изображения, всегда содержащий значение кода маркера - FFh D8h.

Поле APP0 - это маркер Приложения, всегда содержащий значение кода маркера - FFh E0h.

Поле "Длина сегмента APP0", помимо длины сегмента, включает в себя размеры самого поля "Длина" и данные миниатюрного изображения, содержащегося в сегменте APP0. Поэтому, значение этого поля равно (16 + 3) x (XThumbnail) x (YThumbnail).

Поле "Идентификатор" содержит значение 4Ah 46h 49h 46h 00h (JFIF), показывающее, что поток данных принадлежит спецификации JFIF.

Поле "Версия" определяет версию спецификации JFIF, первый байт содержит номер версии, а второй - номер подверсии. У версии 1.02, к примеру, значения байтов поля "Версия" будут соответственно равны 01h 02h, а у более старых - 01h 00h или 01h 01h.

Поля "Units", "Xdensity" и "Ydensity" определяют единицы измерения разрешения формата.

Поле "Units" может принимать следующие значения:

Поля XThumbnail и YThumbnail задают размеры миниатюрного изображения, если оно включено в JFIF APP0 маркер. В противном случае эти поля содержат 0. Миниатюрное изображение - уменьшенное исходное изображение, иногда называемое "иконкой" или "картинкой для предварительного просмотра", записанное в основной поток JPEG - данных. Это изображение состоит из массива XThumbnail * YThumbnail значений пикселей, каждое из которых состоит из 3-х байтов, содержащих 24-битовое RGB значение в порядке R,G,B. Эти изображения не сжимаются.

Сейчас редко кто использует для хранения миниатюрных изображений маркер JFIF APP0, хотя он поддерживаются для обратной совместимости. В версии 1.02 JFIF выделяет под это отдельный маркер расширения, что гораздо удобнее, т.к. миниатюрные изображения бывают разных размеров. В версии 1.02, наряду с 24-битовыми, поддерживаются миниатюрные 256-цветовые изображения, сжатые JPEG-чжатием. Такие миниатюрные изображения ограничены 64K, т.к. они должны помещаться в маркер APP0.

За сегментом маркера JFIF могут следовать один или несколько дополнительных сегментов маркера расширения JFIF, использующихся для хранения дополнительной информации и присутствующих только в JFIF версии 1.02 и больше. Далее приведена структура этих сегментов:

typedef struct _JFIFExtension
{
BYTE   APP0[2];           /* 00h  Маркер приложения */
BYTE   Length[2];         /* 02h  Длина поля APP0   */
BYTE   Identifier[5];     /* 04h  Идентификационная строка "JFXX" (оканчивается '\x0') */
BYTE   ExtensionCode;     /* 09h  Идентификационный код разрешения */
} JFIFEXTENSION;

Поле APP0 содержит значения FFh E0h.

Поле Length содержит значение длины сегмента расширения в байтах.

Поле Identifier содержит значения 4Ah 46h 58h 58h 00h (JFXX).

Поле ExtensionCode указывает тип информации, которая содержится в маркере расширения. В версии 1.02 определены три кода расширения: 10h (миниатюрное изображение кодировано JPEG), 11h (миниатюрное изображение записано в виде 1-байтовых пикселей и палитры) и 13h (миниатюрное изображение записано в виде 3-байтовой RGB пикселей).

Данные расширения следуют за информацией сегмента расширения, а их размер и содержание меняются в зависимости от значения поля ExtensionCode.

JFIF декодер должен игнорировать нераспознанные маркеры расширения и сегменты APPn. Специфические APPn маркеры, не распознанные JPEG декодером, могут быть просто опущены с использованием поля длины маркера.

Маркер JFIF является по существу гарантией, что файл соответствует соглашению JFIF. Следовательно, большинство JFIF декодеров рассматривают сегмент маркера JFIF как необязательный и способны читать исходные потоки данных JPEG, соответствующие соглашениям JFIF относительно цветового пространства и способов выравнивания. (Таких файлов существует немало, потому что JFIF на практике применяется именно в этой области). Качественный JFIF декодер работает с файлом как с потоком блоков, порядок которых не обязательно следует JPEG стандартам. Это позволяет читать нестандартные и неправильные JFIF файлы, как, например, с маркером COM, вставленным между маркерами SOI и JFIF APP0 (таких расширений тоже очень много). Так же неплохо, если декодер может обрабатывать любой JFIF файл с известным старшим и неизвестным младшим номером версии.

Фактически, данные JPEG в JFIF файле расположены после всех маркеров APP0 и соответствуют формату, определенному в документации JPEG. Данные изображения в файле JFIF рекомендуется кодировать алгоритмом JPEG, обеспечивая тем самым максимальную совместимость при обмене данными.

Для распознавания JFIF файла или потока данных, просканируйте данные на значения FFh D8h FFh, идентифицирующие маркер SOI, сопровождающийся другим маркером. В правильном файле JFIF следующий байт будет иметь значение E0h, указывающее на сегмент маркера JFIF APP0. Хотя не исключено, что один или более других сегментов маркера могут быть по ошибке записаны между маркерами SOI JFIF APP0 (нарушение спецификации JFIF). Но декодер, как сказано ранее, должен попытаться прочитать файл.

Следующие 2 байта (длина сегмента APP0) могут принимать различные значения, обычно 00h 10h, за ними следуют 5 байтов: 4Ah 46h 49h 46h 00h (JFIF). Если обнаружены эти значения, маркер SOI (FFh D8h) обозначает начало потока данных JFIF. Если обнаружены только значения FFh D8h FFh и отсутствуют остальные данные, то это исходный поток данных JPEG. Все потоки данных JFIF и JPEG оканчиваются маркером "конец изображения" (FFh D9h).

Существует множество запатентованных форматов, содержащих JPEG данные. Некоторые инкапсулируют потоки данных JPEG и JFIF в свою собственную "обложку". Поиск маркера SOI и считывание до маркера EOI обычно позволяет извлечь JPEG/JFIF данные. Хотя бы один запатентованный формат, а именно формат .HSI от Handmade Software, содержит JPEG данные, но не может быть прочитан и декодирован без специального программного обеспечения, из-за модифицированного процесса JPEG кодирования. (Все .HSI файлы начинаются со значений 68h 73h 69h 31h и не должны рассматриваться, как нормальные JPEG файлы)

Только 2 из не запатентованных форматов наряду с JFIF поддерживают JPEG-кодирование. Последняя версия формата Macintosh PICT присоединяет заголовок PICT к потоку данных JFIF. Если убрать всё до маркера SOI и после маркера EOI, мы получим эквивалентный JFIF файл. Другой формат, поддерживающий JPEG-кодирование, - TIFF 6.0, подробно описан в главе про TIFF.

Дополнительная информация:

Как связаться с C-Cube Microsystems:

C-Cube Microsystems
Attn: Scott St. Clair
Corporate Communications
1778 McCarthy Blvd.
Milpitas, CA 95035

Телефон: 408-944-6300
Факс: 408-944-6314

См. также Главу 9 для информации о сжатии JPEG. Также доступны вопросы и ответы о JPEG и о сжатии, содержащие второстепенную информацию о JPEG.

Стандарт JPEG, как таковой, недоступен в электронном виде; вы должны заказать через ISO бумажную копию. В США эти копии можно заказать по адресу:

American National Standards Institute, Inc.
Attn: Sales
1430 Broadway
New York, NY 10018

Телефон: 212-642-4900

Стандарт поделен на 2 части: Часть 1 является собственно спецификацией. Сейчас часть 1 уже вышла на уровень Международного Стандарта. См. также следующий документ:

Цифровое сжатие и кодирование непрерывных зафиксированных изображений, часть 1: Требования и Указания. Номер документа ISO/IEC - 10918-1.

Часть 2 всё ещё в статусе черновика. См. следующий документ:

Цифровое сжатие и кодирование непрерывных зафиксированных изображений, часть 2: Тестирование. Номер документа ISO/IEC - 10918-2.

См. также обсуждение JPEG в Главе 9 для дополнительных рекомендаций, включая доступные для покупки книги со спецификацией, вопросами и ответами JPEG. Также в наличии имеется несколько JPEG программ и библиотек.



Copyright © 1996, 1994 O'Reilly & Associates, Inc. All Rights Reserved.

Hosted by uCoz