Формат файла jpeg – Что такое jpg формат, его характеристики и как с ним работать

Декодирование JPEG для чайников / Habr

UPD. Был вынужден убрать моноширинное форматирование. В один прекрасный день хабрапарсер перестал воспринимать форматирование внутри тегов pre и code. Весь текст превратился в кашу. Администрация хабра не смогла мне помочь. Теперь неровно, но хотя бы читабельно.

[FF D8]

Вам когда-нибудь хотелось узнать как устроен jpg-файл? Сейчас разберемся! Прогревайте ваш любимый компилятор и hex-редактор, будем декодировать это:

Специально взял рисунок поменьше. Это знакомый, но сильно пережатый favicon Гугла:

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

Даже не зная, как происходит кодирование, мы уже можем кое-что извлечь из файла.
[FF D8] — маркер начала. Он всегда находится в начале всех jpg-файлов.
Следом идут байты [FF FE]. Это маркер, означающий начало секции с комментарием. Следующие 2 байта [00 04] — длина секции (включая эти 2 байта). Значит в следующих двух [3A 29] — сам комментарий. Это коды символов ":" и ")", т.е. обычного смайлика. Вы можете увидеть его в первой строке правой части hex-редактора.


Немного теории


Очень кратко по шагам:
  1. Обычно изображение преобразуется из цветового пространства RGB в YCbCr.
  2. Часто каналы Cb и Cr прореживают, то есть блоку пикселей присваивается усредненное значение. Например, после прореживания в 2 раза по вертикали и горизонтали, пиксели будут иметь такое соответствие:
  3. Затем значения каналов разбиваются на блоки 8x8 (все видели эти квадратики на слишком сжатом изображении).
  4. Каждый блок подвергается дискретно-косинусному-преобразованию (ДКП), являющемся разновидностью дискретного преобразования Фурье. Получим матрицу коэффициетов 8x8. Причем левый верхний коэффициент называется DC-коффициентом (он самый важный и является усредненным значением всех значений), а оставшиеся 63 — AC-коэффициентами.
  5. Получившиеся коэффициенты квантуются, т.е. каждый умножается на коэффициент матрицы квантования (каждый кодировщик обычно использует свою матрицу квантования).
  6. Затем они кодируются кодами Хаффмана.
Давайте подумаем, в каком порядке могут быть закодированы эти данные. Допустим, сначала полностью, для всего изображения, закодирован канал Y, затем Cb, потом Cr. Все помнят загрузку картинок на диал-апе. Если бы они кодировались именно так, нам бы пришлось ждать загрузки всего изображения, прежде чем оно появится на экране. Так же будет неприятно, если потерятся конец файла. Вероятно, существуют и другие весомые причины. Поэтому закодированные данные располагаются поочередно, небольшими частями.

Напоминаю, что каждый блок Yij, Cbij, Crij — это матрица коэффициентов ДКП, закодированная кодами Хаффмана. В файле они располагаются в таком порядке: Y00Y10Y01Y11Cb00Cr00Y20

Чтение файла


После того, как мы извлекли комментарий, будет легко понять, что:
  • Файл поделен на секторы, предваряемые маркерами.
  • Маркеры имеют длину 2 байта, причем первый байт [FF].
  • Почти все секторы хранят свою длину в следующих 2 байта после маркера.
Для удобства подсветим маркеры:
FF D8 FF FE 00 04 3A 29 FF DB 00 43 00 A0 6E 78
8C 78 64 A0 8C 82 8C B4 AA A0 BE F0 FF FF F0 DC
DC F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF DB 00
43 01 AA B4 B4 F0 D2 F0 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01 FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02 FF C4 00 1A
10 01 00 02 03 01 00 00 00 00 00 00 00 00 00 00
00 01 00 12 02 11 31 21 FF C4 00 15 01 01 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 FF
C4 00 16 11 01 01 01 00 00 00 00 00 00 00 00 00
00 00 00 00 11 00 01 FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00 AE E7 61 F2 1B D5 22 85 5D 04 3C
82 C8 48 B1 DC BF FF D9
Маркер [FF DB]: DQT — таблица квантования.

                        FF DB 00 43 00 A0 6E 78
8C 78 64 A0 8C 82 8C B4 AA A0 BE F0 FF FF F0 DC
DC F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF

Заголовок секции всегда занимает 3 байта. В нашем случае это [00 43 00]. Заголовок состоит из:

[00 43] Длина: 0x43 = 67 байт
[0_]    Длина значений в таблице: 0 (0 — 1 байт, 1 — 2 байта)
[_0]    Идентификатор таблицы: 0
Оставшимися 64-мя байтами нужно заполнить таблицу 8x8.
[A0 6E 64 A0 F0 FF FF FF]
[78 78 8C BE FF FF FF FF]
[8C 82 A0 F0 FF FF FF FF]
[8C AA DC FF FF FF FF FF]
[B4 DC FF FF FF FF FF FF]
[F0 FF FF FF FF FF FF FF]
[FF FF FF FF FF FF FF FF]
[FF FF FF FF FF FF FF FF]

Приглядитесь, в каком порядке заполнены значения таблицы. Этот порядок называется zigzag order:

Маркер [FF C0]: SOF0 — Baseline DCT

Этот маркер называется SOF0, и означает, что изображение закодировано базовым методом. Он очень распространен. Но в интернете не менее популярен знакомый вам progressive-метод, когда сначала загружается изображение с низким разрешением, а потом и нормальная картинка. Это позволяет понять что там изображено, не дожидаясь полной загрузки. Спецификация определяет еще несколько, как мне кажется, не очень распространенных методов.

      FF C0 00 11 08 00 10 00 10 03 01 22 00 02

11 01 03 11 01

[00 11] Длина: 17 байт.
[08]    Precision: 8 бит. В базовом методе всегда 8. Как я понял, это разрядность значений каналов.
[00 10] Высота рисунка: 0x10 = 16
[00 10] Ширина рисунка: 0x10 = 16
[03]    Количество компонентов: 3. Чаще всего это Y, Cb, Cr.

1-й компонент:
[01] Идентификатор: 1
[2_] Горизонтальное прореживание (H1): 2
[_2] Вертикальное прореживание (V1): 2
[00] Идентификатор таблицы квантования: 0

2-й компонент:
[02] Идентификатор: 2
[1_] Горизонтальное прореживание (H2): 1
[_1] Вертикальное прореживание (V2): 1
[01] Идентификатор таблицы квантования: 1

3-й компонент:
[03] Идентификатор: 3
[1_] Горизонтальное прореживание (H3): 1
[_1] Вертикальное прореживание (V3): 1
[01] Идентификатор таблицы квантования: 1

Теперь посмотрите, как определить насколько прорежено изображение. Находим Hmax=2 и Vmax=2. Канал i будет прорежен в Hmax

/Hi раз по горизонтали и Vmax/Vi раз по вертикали.

Маркер [FF C4]: DHT (таблица Хаффмана)

Эта секция хранит коды и значения полученные кодированием Хаффмана.

               FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02

[00 15] длина: 21 байт.
[0_]    класс: 0 (0 — таблица DC коэффициэнтов, 1 — таблица AC коэффициэнтов).
[_0]    идентификатор таблицы: 0
Длина кода Хаффмана: 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
Количество кодов:  [01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00]
Количество кодов означает количество кодов такой длины. Обратите внимание, что секция хранит только длины кодов, а не сами коды. Мы должны найти коды сами. Итак, у нас есть один код длины 1 и один — длины 2. Итого 2 кода, больше кодов в этой таблице нет.
С каждым кодом сопоставлено значение, в файле они перечислены следом. Значения однобайтовые, поэтому читаем 2 байта.
[03] — значение 1-го кода.
[02] — значение 2-го кода.

Далее в файле можно видеть еще 3 маркера [FF C4], я пропущу разбор соответствующих секций, он аналогичен вышеприведенному.

Построение дерева кодов Хаффмана

Мы должны построить бинарное дерево по таблице, которую мы получили в секции DHT. А уже по этому дереву мы узнаем каждый код. Значения добавляем в том порядке, в каком указаны в таблице. Алгоритм прост: в каком бы узле мы ни находились, всегда пытаемся добавить значение в левую ветвь. А если она занята, то в правую. А если и там нет места, то возвращаемся на уровень выше, и пробуем оттуда. Остановиться нужно на уровне равном длине кода. Левым ветвям соответствует значение 0, правым — 1.
Замечание:
Не нужно каждый раз начинать с вершины. Добавили значение — вернитесь на уровень выше. Правая ветвь существует? Если да, идите опять вверх. Если нет — создайте правую ветвь и перейдите туда. Затем, с этого места, начинайте поиск для добавления следующего значения.

Деревья для всех таблиц этого примера:

UPD (спасибо anarsoul): В узлах первого дерева (DC, id =0) должны быть значения 0x03 и 0x02

В кружках — значения кодов, под кружками — сами коды (поясню, что мы получили их, пройдя путь от вершины до каждого узла). Именно такими кодами (этой и других таблиц) закодировано само содержимое рисунка.

Маркер [FF DA]: SOS (Start of Scan)

Байт [DA] в маркере означает — «ДА! Наконец-то то мы перешли непосредственно к разбору секции закодированного изображения!». Однако секция символично называется SOS.

&nbsp                    FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00

[00 0C] Длина заголовочной части (а не всей секции): 12 байт.
[03]    Количество компонентов сканирования. У нас 3, по одному на Y, Cb, Cr.

1-й компонент:
[01] Номер компонента изображения: 1 (Y)
[0_] Идентификатор таблицы Хаффмана для DC коэффициэнтов: 0
[_0] Идентификатор таблицы Хаффмана для AC коэффициэнтов: 0

2-й компонент:
[02] Номер компонента изображения: 2 (Cb)
[1_] Идентификатор таблицы Хаффмана для DC коэффициэнтов: 1
[_1] Идентификатор таблицы Хаффмана для AC коэффициэнтов: 1

3-й компонент:
[03] Номер компонента изображения: 3 (Cr)
[1_] Идентификатор таблицы Хаффмана для DC коэффициэнтов: 1
[_1] Идентификатор таблицы Хаффмана для AC коэффициэнтов: 1

Данные компоненты циклически чередуются.

[00], [3F], [00] Об этих байтах можно почитать в спецификации.

На этом заголовочная часть заканчивается, отсюда и до конца (маркера [FF D9]) закодированные данные.

[AE]    [E7]    [61]    [F2]    [1B]
101011101110011101100001111100100

Нахождение DC-коэффициента.
1. Читаем последовательность битов (если встретим 2 байта [FF 00], то это не маркер, а просто байт [FF]). После каждого бита сдвигаемся по дереву Хаффмана (с соответствующим идентификатором) по ветви 0 или 1, в зависимости от прочитанного бита. Останавливаемся, если оказались в конечном узле.
101011101110011101100001111100100

2. Берем значение узла. Если оно равно 0, то коэффициент равен 0, записываем в таблицу и переходим к чтению других коэффициентов. В нашем случае — 02. Это значение — длина коэффициента в битах. Т. е. читаем следующие 2 бита, это и будет коэффициент.
101011101110011101100001111100100

3. Если первая цифра значения в двоичном представлении — 1, то оставляем как есть: DC_coef = значение. Иначе преобразуем: DC_coef = значение-2длина значения+1. Записываем коэффициент в таблицу в начало зигзага — левый верхний угол.

Нахождение AC-коэффициентов.
1. Аналогичен п. 1, нахождения DC коэффициента. Продолжаем читать последовательность:
101011101110011101100001111100100

2. Берем значение узла. Если оно равно 0, это означает, что оставшиеся значения матрицы нужно заполнить нулями. Дальше закодирована уже следующая матрица. Первые несколько дочитавших до этого места и написавших об этом мне в личку, получат плюс в карму. В нашем случае значение узла: 0x31.
Первый полубайт: 0x3 — именно столько нулей мы должны добавить в матрицу. Это 3 нулевых коэффициэнта.
Второй полубайт: 0x1 — длина коэффициэнта в битах. Читаем следующий бит.
101011101110011101100001111100100

3. Аналогичен п. 3 нахождения DC-коэффициента.

Как вы уже поняли, читать AC-коэффициенты нужно пока не наткнемся на нулевое значение кода, либо пока не заполнится матрица.
В нашем случае мы получим:
101011101110011101100001111100100
и матрицу:

[2 0 3 0 0 0 0 0]
[0 1 2 0 0 0 0 0]
[0 -1 -1 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]

Вы заметили, что значения заполнены в том же зигзагообразном порядке?
Причина использования такого порядка простая — так как чем больше значения v и u, тем меньшей значимостью обладает коэффициент Svu в дискретно-косинусном преобразовании. Поэтому, при высоких степенях сжатия малозначащие коэффициенты обнуляют, тем самым уменьшая размер файла.

Аналогично получаем еще 3 матрицы Y-канала…

[-4 1 1 1 0 0 0 0] [ 5 -1 1 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-4 2 2 1 0 0 0 0]
[-1 0 -1 0 0 0 0 0]
[-1 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Ой, я забыл сказать, что закодированные DC-коэффициенты — это не сами DC-коэффициенты, а их разности между коэффициентами предыдущей таблицы (того же канала)! Нужно поправить матрицы:
DC для 2-ой: 2 + (-4) = -2
DC для 3-ой: -2 + 5 = 3
DC для 4-ой: 3 + (-4) = -1

[-2 1 1 1 0 0 0 0] [ 3 -1 1 0 0 0 0 0] [-1 2 2 1 0 0 0 0]
………

Теперь порядок. Это правило действует до конца файла.

… и по матрице для Cb и Cr:

[-1 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0]
[ 1 1 0 0 0 0 0 0] [1 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0]

Так как тут только по одной матрице, DC-коэфициенты можно не трогать.

Вычисления


Квантование

Вы помните, что матрица проходит этап квантования? Элементы матрицы нужно почленно перемножить с элементами матрицы квантования. Осталось выбрать нужную. Сначала мы просканировали первый компонент, его компонента изображения = 1. Компонент изображения с таким идентификатором использует матрицу квантования 0 (у нас она первая из двух). Итак, после перемножения:

[320 0 300 0 0 0 0 0]
[ 0 120 280 0 0 0 0 0]
[ 0 -130 -160 0 0 0 0 0]
[140 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Аналогично получаем еще 3 матрицы Y-канала…

[-320 110 100 160 0 0 0 0] [ 480 -110 100 0 0 0 0 0]
[ 0 0 140 0 0 0 0 0] [-120 -240 -140 0 0 0 0 0]
[ 0 -130 0 0 0 0 0 0] [ 0 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-140 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-160 220 200 160 0 0 0 0]
[-120 0 -140 0 0 0 0 0]
[-140 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

… и по матрице для Cb и Cr.

[-170 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 180 210 0 0 0 0 0 0] [180 -210 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [240 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

Обратное дискретно-косинусное преобразование

Формула не должна доставить сложностей*. Svu — наша полученная матрица коэффициентов. u — столбец, v — строка. syx — непосредственно значения каналов.

*Вообще говоря, это не совсем правда. Когда я смог декодировать и отобразить на экране рисунок 16x16, я взял изображение размером 600x600 (кстати, это была обложка любимого альбома Mind.In.A.Box — Lost Alone). Получилось не сразу — всплыли различные баги. Вскоре я мог любоваться корректно загруженной картинкой. Только очень огорчала скорость загрузки. До сих пор помню, она занимала 7 секунд. Но это и неудивительно, если бездумно пользоваться приведенной формулой, то для вычисления одного канала одного пикселя потребуется нахождения 128 косинусов, 768 умножений, и сколько-то там сложений. Только вдумайтесь — почти тысяча непростых операций только на один канал одного пиксела! К счастью, тут есть простор для отимизации (после долгих экспериментов уменьшил время загрузки до предела точности таймера 15мс, и после этого сменил изображение на фотографию в 25 раз большей площадью. Возможно, напишу об этом отдельной статьей).

Напишу результат вычисления только первой матрицы канала Y (значения округлены):
[138 92 27 -17 -17 28 93 139]
[136 82 5 -51 -55 -8 61 111]
[143 80 -9 -77 -89 -41 32 86]
[157 95 6 -62 -76 -33 36 86]
[147 103 37 -12 -21 11 62 100]
[ 87 72 50 36 37 55 79 95]
[-10 5 31 56 71 73 68 62]
[-87 -50 6 56 79 72 48 29]

и 2-х оставшихся:
Cb Cr
[ 60 52 38 20 0 -18 -32 -40] [ 19 27 41 60 80 99 113 120]
[ 48 41 29 13 -3 -19 -31 -37] [ 0 6 18 34 51 66 78 85]
[ 25 20 12 2 -9 -19 -27 -32] [-27 -22 -14 -4 7 17 25 30]
[ -4 -6 -9 -13 -17 -20 -23 -25] [-43 -41 -38 -34 -30 -27 -24 -22]
[ -37 -35 -33 -29 -25 -21 -18 -17] [-35 -36 -39 -43 -47 -51 -53 -55]
[ -67 -63 -55 -44 -33 -22 -14 -10] [ -5 -9 -17 -28 -39 -50 -58 -62]
[ -90 -84 -71 -56 -39 -23 -11 -4] [ 32 26 14 -1 -18 -34 -46 -53]
[-102 -95 -81 -62 -42 -23 -9 -1] [ 58 50 36 18 -2 -20 -34 -42]

А теперь… мини-тест!
Что делать дальше?

  1. О, пойду-ка поем!
  2. Да я вообще не въезжаю, о чем речь.
  3. Раз значение цветов YCbCr получены, осталось преобразовать в RGB, типа так: YCbCrToRGB(Yij, Cbij, Crij), Yij, Cbij, Crij — наши полученные матрицы.
  4. 4 матрицы Y, и по одной Cb и Cr, так как мы прореживали каналы и 4 пикселям Y соответствует по одному Cb и Cr. Поэтому вычислять так: YCbCrToRGB(Yij, Cb[i/2][j/2], Cr[i/2][j/2])
Если вы выбрали 1 и 4, то я рад за вас. Либо вы все правильно поняли, либо скоро будете получать удовольствие от еды.
YCbCr в RGB

R = Y + 1.402 * Cr
G = Y — 0.34414 * Cb — 0.71414 * Cr
B = Y + 1.772 * Cb
Не забудьте прибавить по 128. Если значения выйдут за пределы интервала [0, 255], то присвоить граничные значения. Формула простая, но тоже отжирает долю процессорного времени.

Вот полученные таблицы для каналов R, G, B для левого верхнего квадрата 8x8 нашего примера:
255 248 194 148 169 215 255 255
255 238 172 115 130 178 255 255
255 208 127 59 64 112 208 255
255 223 143 74 77 120 211 255
237 192 133 83 85 118 184 222
177 161 146 132 145 162 201 217
56 73 101 126 144 147 147 141
0 17 76 126 153 146 127 108

231 185 117 72 67 113 171 217
229 175 95 39 28 76 139 189
254 192 100 31 15 63 131 185
255 207 115 46 28 71 134 185
255 241 175 125 112 145 193 230
226 210 187 173 172 189 209 225
149 166 191 216 229 232 225 220
72 110 166 216 238 231 206 186

255 255 249 203 178 224 255 255
255 255 226 170 140 187 224 255
255 255 192 123 91 138 184 238
255 255 208 139 103 146 188 239
255 255 202 152 128 161 194 232
255 244 215 200 188 205 210 227
108 125 148 172 182 184 172 167
31 69 122 172 191 183 153 134

Конец


Вообще я не специалист по JPEG, поэтому вряд ли смогу ответить на все вопросы. Просто когда я писал свой декодер, мне часто приходилось сталкиваться с различными непонятными проблемами. И когда изображение выводилось некорректно, я не знал где допустил ошибку. Может неправильно проинтерпретировал биты, а может неправильно использовал ДКП. Очень не хватало пошагового примера, поэтому, надеюсь, эта статья поможет при написании декодера. Думаю, она покрывает описание базового метода, но все-равно нельзя обойтись только ей. Предлагаю вам ссылки, которые помогли мне:
ru.wikipedia.org/JPEG — для поверхностного ознакомления.
en.wikipedia.org/JPEG — гораздо более толковая статья о процессах кодирования/декодирования.
JPEG Standard (JPEG ISO/IEC 10918-1 ITU-T Recommendation T.81) — не обойтись без 186-страничной спецификации. Но нет повода для паники — три четверти занимают блок-схемы и приложения.
impulseadventure.com/photo — Хорошие подробные статьи. По примерам я разобрался как строить деревья Хаффмана и использовать их при чтении соответствующей секции.
JPEGsnoop — На том же сайте есть отличная утилита, которая вытаскивает всю информацию jpeg-файла.

[FF D9]

habr.com

Файл формата jpg: чем открыть, описание, особенности

  • WINDOWS
  • MAC OS
  • LINUX
  • IOS
  • ANDROID
  • игры
  • Новости
  • Статьи и обзоры

    freesoft.ru

    Конвертировать JPG в JPEG онлайн, бесплатно преобразовать .jpg в .jpeg

    Расширение файла .jpeg
    Категория файла images
    Описание JPEG – популярный графический формат, отличающийся высокой степенью сжатия, что приводит к снижению качества изображения. Использует технологию кодирования плавных цветовых переходов, предоставляя возможность многократно сократить объем данных в процессе записи изображения. Из-за малых размеров востребован у владельцев веб-сайтов, позволяя реально экономить трафик. Также нередко применяется в картах памяти цифровых видеокамер. Алгоритм JPEG оптимально подходит для сжатия фотографий и картин, в которых присутствуют реалистичные сюжеты с незначительной контрастностью цветов. Не рекомендуется использовать этот формат для сжатия чертежей и различных видов графики, так как сильный контраст между рядом находящимися пикселами провоцирует появление видимых артефактов.
    Технические детали Процедура сжатия цифровых изображений в формате JPEG осуществляется в несколько этапов. Сначала фотография преобразуется в цветовое пространство YCbCr, затем она делится на квадраты для определения верхнего диапазона цветового спектра. В завершение производится кодирование цветов и яркости. JPEG использует систему сжатия «с потерями» и технологию дискретного косинусного преобразования. Формат выступает одновременно стандартом ИСО и Международного союза электросвязи. Пропорция сжатия файла находится в диапазоне от 10:1 до 100:1. При этом снижение качества изображения может варьироваться от незначительного до существенного.
    Программы

    Adobe Photoshop

    Apple Preview

    Corel Paint Shop Pro

    Основная программа MS Paint
    Разработчик The JPEG Committee
    MIME type

    image/jpeg

    onlineconvertfree.com

    Конвертировать JPEG в JPG онлайн, бесплатно преобразовать .jpeg в .jpg

    Расширение файла .jpeg
    Категория файла images
    Описание JPEG – популярный графический формат, отличающийся высокой степенью сжатия, что приводит к снижению качества изображения. Использует технологию кодирования плавных цветовых переходов, предоставляя возможность многократно сократить объем данных в процессе записи изображения. Из-за малых размеров востребован у владельцев веб-сайтов, позволяя реально экономить трафик. Также нередко применяется в картах памяти цифровых видеокамер. Алгоритм JPEG оптимально подходит для сжатия фотографий и картин, в которых присутствуют реалистичные сюжеты с незначительной контрастностью цветов. Не рекомендуется использовать этот формат для сжатия чертежей и различных видов графики, так как сильный контраст между рядом находящимися пикселами провоцирует появление видимых артефактов.
    Технические детали Процедура сжатия цифровых изображений в формате JPEG осуществляется в несколько этапов. Сначала фотография преобразуется в цветовое пространство YCbCr, затем она делится на квадраты для определения верхнего диапазона цветового спектра. В завершение производится кодирование цветов и яркости. JPEG использует систему сжатия «с потерями» и технологию дискретного косинусного преобразования. Формат выступает одновременно стандартом ИСО и Международного союза электросвязи. Пропорция сжатия файла находится в диапазоне от 10:1 до 100:1. При этом снижение качества изображения может варьироваться от незначительного до существенного.
    Программы

    Adobe Photoshop

    Apple Preview

    Corel Paint Shop Pro

    Основная программа MS Paint
    Разработчик The JPEG Committee
    MIME type

    image/jpeg

    onlineconvertfree.com

    Конвертер JPEG файлов онлайн, бесплатное преобразование изображений в JPEG

    Расширение файла .jpeg
    Категория файла images
    Описание JPEG – популярный графический формат, отличающийся высокой степенью сжатия, что приводит к снижению качества изображения. Использует технологию кодирования плавных цветовых переходов, предоставляя возможность многократно сократить объем данных в процессе записи изображения. Из-за малых размеров востребован у владельцев веб-сайтов, позволяя реально экономить трафик. Также нередко применяется в картах памяти цифровых видеокамер. Алгоритм JPEG оптимально подходит для сжатия фотографий и картин, в которых присутствуют реалистичные сюжеты с незначительной контрастностью цветов. Не рекомендуется использовать этот формат для сжатия чертежей и различных видов графики, так как сильный контраст между рядом находящимися пикселами провоцирует появление видимых артефактов.
    Технические детали Процедура сжатия цифровых изображений в формате JPEG осуществляется в несколько этапов. Сначала фотография преобразуется в цветовое пространство YCbCr, затем она делится на квадраты для определения верхнего диапазона цветового спектра. В завершение производится кодирование цветов и яркости. JPEG использует систему сжатия «с потерями» и технологию дискретного косинусного преобразования. Формат выступает одновременно стандартом ИСО и Международного союза электросвязи. Пропорция сжатия файла находится в диапазоне от 10:1 до 100:1. При этом снижение качества изображения может варьироваться от незначительного до существенного.
    Программы

    Adobe Photoshop

    Apple Preview

    Corel Paint Shop Pro

    Основная программа MS Paint
    Разработчик The JPEG Committee
    MIME type

    image/jpeg

    onlineconvertfree.com

    Конвертирование файлов с расширением JPG

    Все конвертеры

    Формат файлов JPG Raster image

    Фото и изображения, которые необходимо передать по электронной почте или выложить в Интернет, должны быть сжаты с целью уменьшения времени их выгрузки и загрузки, а также с целью экономии ресурсов Интернет-канала. Для этого обычно используют изображения в формате JPG. Сжатие с потерями равномерно по всему изображению, причем чем ниже степень сжатия, тем более четким становится изображение. Цифровые фотоаппараты очень часто работают именно с файлами JPG. Кроме того, для загрузки фото в Интернете необходим именно этот формат (при этом некоторые сервисы позволяют загружать и другие файлы). Файлы JPG в наибольшей мере подходят для хранения фотографий и репродукций, а не изображений с более четкими линиями и резкой сменой цветов. Кроме того, текст также весьма плохо отображается на таких файлах.

    Технические сведения о файлах JPG

    Сжатие с потерями изображений JPG обычно составляет 10 к 1, что приводит к потере качества. Два основных типа изображений JPG - JPG/JFIF (используемые для хранения и отправки фотографий он-лайн), а также JPG/Exif (используемые во многих фотоаппаратах). Из-за определенного метода сжатия снимков JPG происходит определенная потеря данных, т.е. редактировать такие снимки слишком радикально не стоит, т.к. каждый сеанс редактирования уменьшает качество снимка. Это происходит из-за повторных сжатий после каждого редактирования. Файлы JPG в наибольшей степени подходят для презентации окончательного варианта снимка, в то время как для редактирование лучше всего использовать несжатые файлы. Сжатие в отношении 100 к 1 также возможно, однако потери качества будут слишком заметными. Рекомендуем не увеличивать степень сжатия выше 20 к 1. Это позволит сохранить качество снимка, а также снизить кол-во посторонней информации на фото.

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

    www.online-convert.com

    JPG и JPEG 2019

    Вы когда-нибудь задумывались над тем, какая разница между форматами изображений JPG и JPEG, которые мы используем почти каждый день? Вы знаете, как использовать эти форматы файлов в каждой ситуации? Ну, путаница между двумя форматами файлов всегда была там. Эти форматы файлов, связанные с цифровыми изображениями, со временем эволюционировали, внедряя новые и улучшенные функции для удовлетворения потребностей современной технологии изображения. При этом JPG и JPEG являются двумя наиболее распространенными расширениями файлов для сохранения цифровых изображений, особенно для изображений, создаваемых цифровой фотографией. Давайте рассмотрим два формата файлов.

    Что такое JPEG?

    JPEG является одним из наиболее распространенных форматов изображений, предлагаемых Joint Photographic Experts Group для сохранения и хранения цифровых изображений. Формат файла называется форматом обмена файлами JPEG (сортировка для JIFF), который был создан с единственной целью хранения цифровых изображений, особенно тех, которые используются цифровой фотографией. Почти все цифровые камеры высокой четкости, включая современные смартфоны, используют расширение файла JPEG для хранения файлов изображений. Это один из широко используемых расширений файлов, поскольку он поддерживает 16 777 216 цветов, которые производятся с использованием 8 бит каждого в цветовой модели RGB. Он способен хранить 24 бита на пиксель, способный отображать более 16 миллионов цветов, обеспечивая лучшую цветовую схему и контрастное разрешение. Однако он не идеален для изображений с острыми краями.

    Один недостаток JPEG заключается в том, что это алгоритм сжатия с потерями, который значительно уменьшает размер файла при каждом сжатии, что приводит к ухудшению качества изображения. Подобно ZIP-файлам, использующим избыточность в файлах для достижения максимального сжатия, JPEG делает это, удаляя блоки пикселей или разделов изображений, тем самым уменьшая качество изображения. Технически он сравнивает каждый пиксель с соседними пикселями, чтобы настроить коэффициент сжатия, который может составлять от 2: 1 до 100: 1. Это приводит к потере плотности в цифровой фотографии, что делает ее менее подходящей для тех, кто пытается внести множество изменений и сохраняет файлы изображений. При каждом сохранении наблюдается небольшая потеря качества изображения из-за сжатия. Он может быть сохранен с расши

    ru.esdifferent.com

    Формат файла jpeg – Что такое jpg формат, его характеристики и как с ним работать

Отправить ответ

avatar
  Подписаться  
Уведомление о
Пролистать наверх