CodeNet / Приложения / Алгоритмы / Графика / JPG
CodeNet / Приложения / Алгоритмы / Сжатие и кодирование / JPG
CodeNet / Приложения / Графика / Форматы файлов / JPG
CodeNet / Остальное / Форматы файлов / JPG
CodeNet / Приложения / Алгоритмы / Сжатие и кодирование / JPG
CodeNet / Приложения / Графика / Форматы файлов / JPG
CodeNet / Остальное / Форматы файлов / JPG
JPG
Автор следующей информации: Oliver Fromme. Leibnizstr. 18-61 38678 Clausthal. GERMANY |
JPEG/JFIF формат файла:
- заголовок (2 байта): $ff, $d8 (SOI) (эти два идентифицируют JPEG/JFIF файл)
- для JFIF файлов, сегмент APP0 немедленно следует за маркером SOI, смотрите ниже
- любое число "сегментов" (подобно IFF (Image File Format) кускам), смотрите ниже
- хвостовик (2 байта): $ff, $d9 (EOI)
Формат сегмента:
- заголовок (4 байта):
$ff идентифицирует сегмент
n тип сегмента (один байт)
sh, sl - размер сегмента, включая эти два байта, но не включая $ff и байт типа. Примечание, не порядок Intel: сначала старший байт, затем младший байт! - содержимое сегмента, максимум 65533 байта.
Примечания:
- Есть сегменты без параметров (обозначенные '*'), которые не имеет спецификацию размера (и никакого содержания), просто $ff и байт типа.
- Любое число $ff байтов между сегментами легальное и должно быть пропущено.
Типы сегментов:
- *TEM = $01 обычно вызывает ошибки декодирования, может быть проигнорировано
- SOF0 = $c0 Начало Кадра (Baseline JPEG), относительно деталей смотрите ниже
- SOF1 = $c1 dito
- SOF2 = $c2 обычно неподдерживаемый
- ...
- SOF9 = $c9 для арифметического кодирования, обычно не поддерживается
- SOF10 = $ca обычно неподдерживаемый
- ...
- DHT = $c4 Определение Таблицы Хаффмана, относительно деталей смотрите ниже
- JPG = $c8 неопределенный/зарезервированный (вызывает ошибки декодирования)
- DAC = $cc Определение Арифметической Таблицы, обычно не поддерживается
- *RST0 = $d0 RSTn используются для синхронизации, может быть проигнорировано
- ...
- *RST7 = $d7
- SOI = $d8 Начало Изображения
- EOI = $d9 Конец Изображения
- SOS = $da Начало Сканирования, относительно деталей смотрите ниже
- DQT = $db Определение Таблицы Квантования, относительно деталей смотрите ниже
- DNL = $dc обычно неподдерживаемый, игнорировать
- DRI = $dd Определение Интервала Перезапуска, относительно деталей смотрите ниже
- APP0 = $e0 JFIF маркеры сегментов приложения, относительно деталей смотрите ниже
- APP15 = $ef игнорировать
- COM = $fe Комментарий, относительно деталей смотрите ниже
- Все другие типы сегментов резервируются и должны быть проигнорированы (пропущены).
SOF0: Начало Кадра 0:
- $ff, $c0 (SOF0)
- длина (старший байт, младший байт), 8+components*3
- точность данных (1 байт) в битах/единицу, обычно 8 (12 и 16 не поддерживается большинством программного обеспечения)
- высота изображения (2 байта, High-Low), должно быть >0, если DNL не поддерживается
- ширина изображения (2 байта, High-Low), должно быть >0, если DNL не поддерживается
- количество компонентов (1 байт), обычно 1 = черно-белый, 3 = цвет YCbCr или YIQ, 4 = цвет CMYK)
- для каждого компонента: 3 байта
- идентификатор компонента (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
- показатели дискретизации (бит 0-3 вертикальной, 4-7 горизонтальной)
- номер таблицы квантования
Замечания:
- JFIF использует также 1 компонент (Y, черно-белое изображение) или 3 компонента (YCbCr, иногда называемое YUV, цветное).
APP0: JFIF маркер сегмента:
- $ff, $e0 (APP0)
- длина (старший байт, младший байт), должна быть >= 16
- 'JFIF'#0 ($4a, $46, $49, $46, $00), идентифицирует JFIF
- номер общей версии, должен быть 1 (в противном случае ошибка)
- номер подверсии, должен быть 0..2 (в противном случае попытка декодирования по-другому)
- единица для x/y разрешения:
1 = x/y-разрешение в точках/дюйм
2 = x/y-разрешение в точках/сантиметр
- x-разрешение (старший байт, младший байт), должно быть <> 0
- y-разрешение (старший байт, младший байт), должно быть <> 0
- ширина предварительного просмотра (1 байт)
- высота предварительного просмотра (1 байт)
- n байт для предварительного просмотра (RGB 24 бит) n = ширина*высота*3
Замечания:
- Если нет 'JFIF'#0, или длина <16, тогда это - вероятно не JFIF сегмент и должен быть проигнорирован.
- Нормально единицы=0, x-разрешение=1, y-разрешение=1, означает, что отношение числа точек - 1:1 (равномерно масштабированное).
- JFIF файлы с предварительным просмотром встречаются очень редко, предварительный просмотр может обычно быть проигнорирован. Если нет предварительного просмотра, тогда ширина=0 и высота=0.
- Если длина не соответствует размеру предварительного просмотра, можно выдать предупреждение, затем продолжить декодирование.
DRI: Определение Интервала Перезапуска:
- $ff, $dd (DRI)
- длина (старший байт, младший байт), должна быть = 4
- интервал перезапуска (старший байт, младший байт) в единицах блоков MCU, означает, что каждые n блоков MCU может быть найден маркер RSTn.
- Первый маркер будет RST0, затем RST1 и т.п., после RST7 повторится с RST0.
DQT: Определение Таблицы Квантования:
- $ff, $db (DQT)
- длина (старший байт, младший байт)
- информация о таблице квантования (1 байт):
биты 4..7: точность таблицы,
0 = 8 бит, в противном случае 16 бит
- n байт таблицы n = 64*(точность+1)
Замечания:
- Единственный сегмент DQT может содержать несколько таблиц, каждая со своим собственным байтом информации.
- Для точности=1 (16 бит), порядок является High-Low (Старшим-Младшим) для каждого из 64 целых значений.
DAC: Определение Арифметической Таблицы:
Текущее программное обеспечение не поддерживает арифметическое кодирование по законным причинам. JPEG файлы, использующие арифметическое кодирование не могут быть обработаны.
DHT: Определение Таблицы Хаффмана:
- $ff, $c4 (DHT)
- длина (старший байт, младший байт)
- информация о таблице Хаффмана (1 байт):
бит 4 : тип таблицы, 0 = таблица DC, 1 = таблица AC
биты 5..7: не используются, должны быть 0
- 16 байт: количество символов с кодами длины 1..16, сумма этих байтов является общим числом кодов, которые должны быть <= 256
- n байт: таблица, содержащая символы в порядке повышения длины кода (n = общее число кодов)
Замечания:
- Единственный сегмент DHT может содержать несколько таблиц, каждая со своим собственным байтом информации.
COM: Комментарий:
- $ff, $fe (COM)
- длина (старший байт, младший байт) комментария = L+2
- Комментарий = байтовый поток длиной L
SOS: Начало Сканирования:
- $ff, $da (SOS)
- длина (старший байт, младший байт), должна быть 6+2*(количество компонентов сканирования)
- количество компонентов сканирования (1 байт), должно быть >=1 и <=4 (в противном случае ошибка), обычно 1 или 3
- для каждого компонента: 2 байта
- идентификатор компонента (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), смотри SOF0
- использование таблицы Хаффмана:
биты 4..7: таблица DC (0..3)
- 3 байта, которые должны игнорироваться
Замечания:
- Данные об изображении (данные сканирования) следуют сразу за сегментом SOS.