Формат обмена файлами JPEG ( JFIF ) — это стандарт формата файла изображения, опубликованный как Рекомендация ITU-T T.871 и ISO/IEC 10918-5. Он определяет дополнительные спецификации для формата контейнера, который содержит данные изображения, закодированные с помощью алгоритма JPEG . Базовые спецификации для контейнерного формата JPEG определены в Приложении B к стандарту JPEG, известному как JPEG Interchange Format (JIF). JFIF основан на JIF, чтобы устранить некоторые ограничения JIF, включая ненужную сложность, регистрацию образцов компонентов, разрешение, соотношение сторон и цветовое пространство .. Поскольку JFIF не является исходным стандартом JPG, можно ожидать другой MIME-тип, но каким-то образом он все еще регистрируется как «image/jpeg» (указывая на его первичный формат данных, а не на измененную информацию).
JFIF взаимно несовместим с более новым форматом файла изображения Exchangeable (Exif).
JFIF определяет ряд деталей, которые не указаны в стандарте JPEG Part 1 ( ISO / IEC 10918-1, Рекомендация ITU-T T.81.) [1]
JPEG позволяет нескольким компонентам (таким как Y, Cb и Cr ) иметь разные разрешения, но не определяет, как должны быть выровнены эти разные массивы сэмплов (которые отображают растровые изображения). Информация, которая создает пиксели, визуализируется с ожиданием указания прямоугольников по их центроиду, а не непосредственно пиксельными данными или «первым углом и заливкой» и т. Д., Что необычно.
Стандарт JPEG не включает какой-либо метод кодирования разрешения или соотношения сторон изображения. JFIF предоставляет информацию о разрешении или соотношении сторон, используя расширение сегмента приложения для JPEG. Он использует сегмент приложения № 0 с заголовком сегмента, состоящим из завершающейся нулем строки , обозначающей «JFIF» в ASCII , за которой следует байт, равный 0, и указывает, что это должен быть первый сегмент в файле, что упрощает распознать файл JFIF. Изображения Exif , записанные цифровыми камерами, обычно не включают этот сегмент, но обычно во всех других отношениях соответствуют стандарту JFIF.
Стандарт JPEG, используемый для кодирования сжатия в файлах JFIF, не определяет, какое цветовое кодирование должно использоваться для изображений. JFIF определяет используемую цветовую модель : либо Y для оттенков серого, либо YCbCr , полученный из основных цветов RGB , как определено в CCIR 601 .(теперь известный как Рек. МСЭ-R BT.601), за исключением другого "полного диапазона" масштабирования компонентов Y, Cb и Cr. В отличие от «диапазона студии», определенного в CCIR 601, в котором черный цвет представлен Y=16, а белый — Y=235, а значения за пределами этого диапазона доступны для обработки сигналов «запаса» и «пространства для ног», JFIF использует все 256 уровней. 8-битного представления, так что Y=0 для черного и Y=255 для пикового белого. Основные цвета RGB, определенные в JFIF через CCIR 601, также несколько отличаются от того, что стало обычной практикой в новых приложениях (например, они немного отличаются от основных цветов, определенных в sRGB ). Более того, CCIR 601 (до 2007 г.) не давал точного определения основных цветов RGB; вместо этого он полагался на основные практики телевизионной индустрии.
Интерпретация цвета изображения JFIF может быть улучшена путем внедрения профиля ICC , метаданных цветового пространства или тега sRGB и использования приложения, интерпретирующего эту информацию.
Файл JFIF состоит из последовательности маркеров или сегментов маркеров (подробности см. в разделе JPEG, синтаксис и структура ). Маркеры определены в части 1 стандарта JPEG . [1] Каждый маркер состоит из двух байтов: FF
байт, за которым следует байт, не равный 00
или , FF
и определяющий тип маркера. Некоторые маркеры стоят отдельно, но большинство из них указывают на начало сегмента маркера, содержащего байты данных, в соответствии со следующим шаблоном:
FF xx s1 s2 [data bytes]
Байты s1 и s2 взяты вместе для представления 16-битного целого числа с обратным порядком байтов, определяющего длину следующих «байтов данных», плюс 2 байта, используемых для представления длины. Другими словами, s1 и s2 определяют количество следующих байтов данных как .
В соответствии с частью 1 стандарта JPEG приложения могут использовать сегменты маркеров APP и определять конкретное для приложения значение данных. В стандарте JFIF определены следующие сегменты маркера APP:
Они описаны ниже.
Стандарт JFIF требует, чтобы сегмент маркера JFIF APP0 следовал сразу за маркером SOI. Если используется сегмент маркера APP0 расширения JFIF, он должен следовать сразу за сегментом маркера JFIF APP0. [2] Таким образом, файл JFIF будет иметь следующую структуру:
Файловая структура JFIF | ||
---|---|---|
Сегмент | Код | Описание |
ТАК ЧТО Я | FF D8 | Начало изображения |
JFIF-APP0 | FF E0 s1 s2 4A 46 49 46 00 ... | увидеть ниже |
JFXX-APP0 | FF E0 s1 s2 4A 46 58 58 00 ... | необязательно, см. ниже |
… дополнительные сегменты маркеров (например, SOF, DHT, COM) | ||
SOS | FF DA | Начало сканирования |
сжатые данные изображения | ||
ВЗ | FF D9 | Конец изображения |
В обязательном сегменте маркера JFIF APP0 указываются параметры изображения. При желании можно встроить несжатую миниатюру.
Сегмент маркера JFIF APP0 | ||
---|---|---|
Поле | Размер (байты) | Описание |
Маркер APP0 | 2 | FF E0 |
Длина | 2 | Длина сегмента без маркера APP0 |
Идентификатор | 5 | 4A 46 49 46 00 = "JFIF" в ASCII , оканчивающийся нулевым байтом |
JFIF-версия | 2 | Первый байт для основной версии, второй байт для дополнительной версии ( 01 02 для 1.02) |
Единицы плотности | 1 | Единицы для следующих полей плотности пикселей
|
плотность | 2 | Горизонтальная плотность пикселей. Не должен быть равен нулю |
Плотность | 2 | Вертикальная плотность пикселей. Не должен быть равен нулю |
Xthumbnail | 1 | Количество пикселей по горизонтали для следующей встроенной миниатюры RGB. Может быть ноль |
Yминиатюра | 1 | Количество пикселей по вертикали для следующей встроенной миниатюры RGB. Может быть ноль |
Данные эскиза | 3 × п | Несжатые 24-битные растровые эскизы RGB (8 бит на цветовой канал) в порядке R0, G0, B0, ... Rn-1, Gn-1, Bn-1; где n = Xthumbnail × Ythumbnail |
Сразу за сегментом маркера JFIF APP0 может следовать сегмент маркера APP0 расширения JFIF. Этот сегмент может присутствовать только для версий JFIF 1.02 и выше. Это позволяет вставлять миниатюру изображения в 3 различных форматах.
Сегмент маркера APP0 расширения JFIF | ||
---|---|---|
Поле | Размер (байты) | Описание |
Маркер APP0 | 2 | FF E0 |
Длина | 2 | Длина сегмента без маркера APP0 |
Идентификатор | 5 | 4A 46 58 58 00 = "JFXX" в ASCII , оканчивающийся нулевым байтом |
Формат миниатюр | 1 | Указывает, какой формат данных используется для следующего встроенного эскиза:
|
Данные эскиза | Переменная | Зависит от формата эскиза, см. ниже |
Данные эскизов зависят от формата эскизов следующим образом:
Миниатюра, сохраненная с использованием кодировки JPEG | ||
---|---|---|
Поле | Размер (байты) | Описание |
ТАК ЧТО Я | 2 | FF D8 |
Переменная | Должен быть в формате JIF с использованием YCbCr или просто Y и не должен содержать сегменты JFIF или JFXX. | |
ВЗ | 2 | FF D9 |
Миниатюра хранится с использованием одного байта на пиксель | ||
---|---|---|
Поле | Размер (байты) | Описание |
Xthumbnail | 1 | Количество пикселей по горизонтали для следующей встроенной миниатюры. Не должен быть равен нулю |
Yминиатюра | 1 | Количество пикселей по вертикали для следующей встроенной миниатюры. Не должен быть равен нулю |
Палитра эскизов | 768 | 256 записей палитры, каждая из которых содержит 24-битное значение цвета RGB. |
Данные эскиза | н | Один байт на пиксель, содержащий индекс цвета в палитре, где n = Xthumbnail × Ythumbnail |
Миниатюра хранится с использованием трех байтов на пиксель | ||
---|---|---|
Поле | Размер (байты) | Описание |
Xthumbnail | 1 | Количество пикселей по горизонтали для следующей встроенной миниатюры. Не должен быть равен нулю |
Yминиатюра | 1 | Количество пикселей по вертикали для следующей встроенной миниатюры. Не должен быть равен нулю |
Данные эскиза | 3 × п | Несжатые 24-битные растровые эскизы RGB (8 бит на цветовой канал) в порядке R0, G0, B0, ... Rn-1, Gn-1, Bn-1; где n = Xthumbnail × Ythumbnail |
Более новый формат файла изображения Exchangeable (Exif) сравним с JFIF, но эти два стандарта несовместимы друг с другом. Это связано с тем, что оба стандарта определяют, что их конкретный сегмент приложения (APP0 для JFIF, APP1 для Exif) должен следовать сразу за маркером SOI. На практике многие программы и цифровые камеры создают файлы, включающие оба сегмента приложения. Это не повлияет на декодирование изображения для большинства декодеров, но плохо спроектированные синтаксические анализаторы JFIF или Exif могут не распознавать файл должным образом.
JFIF совместим с расширениями Adobe Photoshop JPEG «Блок информационных ресурсов» и метаданными модели обмена информацией IPTC , поскольку JFIF не препятствует другим сегментам приложений, а расширения Photoshop не обязательно должны быть первыми в файле. Однако Photoshop обычно сохраняет буферы CMYK как четырехкомпонентные «Adobe JPEG», которые не соответствуют JFIF. Поскольку эти файлы не находятся в цветовом пространстве YCbCr, они обычно не декодируются веб-браузерами и другим программным обеспечением для Интернета.
Разработкой документа JFIF руководил Эрик Гамильтон из C-Cube Microsystems , а соглашение по первой версии было заключено в конце 1991 года на встрече, проведенной в C-Cube, с участием около 40 представителей различных компьютерных, телекоммуникационных компаний и компаний по обработке изображений. Вскоре после этого была опубликована небольшая версия — JFIF 1.01. [3] В течение почти 20 лет последней доступной версией была версия 1.02, опубликованная 1 сентября 1992 года. [2]
В 1996 году RFC 2046 указал, что формат изображения, используемый для передачи изображений JPEG через Интернет, должен быть JFIF. Тип MIME "image/jpeg" должен быть закодирован как JFIF. На практике, однако, практически все программное обеспечение Интернета может декодировать любое базовое изображение JIF , в котором используются компоненты Y или YCbCr, независимо от того, совместимо ли оно с JFIF или нет.
Со временем C-Cube был реструктурирован (и в конечном итоге превратился в Harmonic , LSI Logic , Magnum Semiconductor , Avago Technologies , Broadcom и GigOptix, GigPeak и т. д.) и потерял интерес к документу, а спецификация не имела официального издателя. пока он не был подхвачен Ecma International и Объединенной группой экспертов по фотографии ITU-T / ISO / IEC примерно в 2009 году, чтобы не потерять его для истории и предоставить возможность официально цитировать его в стандартных публикациях и улучшить его редакционное качество. Он был опубликован ECMA в 2009 году как Технический отчет № 98, чтобы избежать потери исторических данных [3] .и он был официально стандартизирован ITU-T в 2011 году как его Рекомендация T.871 [4] и ISO/IEC в 2013 году как ISO/IEC 10918-5, [5] . Более новые публикации включали редакционные улучшения, но не содержали существенных технических изменений.