Jpg структура файла: Декодирование JPEG для чайников / Хабр

Jpg структура файла: Декодирование JPEG для чайников / Хабр

alexxlab 25.11.2019

Содержание

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

[FF D8]

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

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

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

Даже не зная, как происходит кодирование, мы уже можем кое-что извлечь из файла.

[FF D8] — маркер начала. Он всегда находится в начале всех jpg-файлов.

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


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

Очень кратко:


  • Обычно изображение преобразуется из цветового пространства RGB в YCbCr.
  • Часто каналы Cb и Cr прореживают, то есть блоку пикселей присваивается усредненное значение. Например, после прореживания в 2 раза по вертикали и горизонтали, пиксели будут иметь такое соответствие:


  • Затем значения каналов разбиваются на блоки 8×8 (все видели эти квадратики на слишком сжатом изображении).
  • Каждый блок подвергается дискретно-косинусному преобразованию (ДКП), являющемся разновидностью дискретного преобразования Фурье. Получим матрицу коэффициетов 8×8. Причем левый верхний коэффициент называется DC-коффициентом (он самый важный и является усредненным значением всех значений), а оставшиеся 63 — AC-коэффициентами.
  • Получившиеся коэффициенты квантуются, т.е. каждый умножается на коэффициент матрицы квантования (каждый кодировщик обычно использует свою матрицу квантования).
  • Затем они кодируются кодами Хаффмана.

Закодированные данные располагаются поочередно, небольшими частями:

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


Чтение файла

Файл поделен на секторы, предваряемые маркерами. Маркеры имеют длину 2 байта, причем первый байт [FF]. Почти все секторы хранят свою длину в следующих 2 байта после маркера. Для удобства подсветим маркеры:


Маркер [FF DB]: DQT — таблица квантования


  • [00 43] Длина: 0x43 = 67 байт
  • [0_] Длина значений в таблице: 0 (0 — 1 байт, 1 — 2 байта)
  • [_0] Идентификатор таблицы: 0

Оставшимися 64-мя байтами нужно заполнить таблицу 8×8.

[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-метод, когда сначала загружается изображение с низким разрешением, а потом и нормальная картинка. Это позволяет понять что там изображено, не дожидаясь полной загрузки. Спецификация определяет еще несколько, как мне кажется, не очень распространенных методов.


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

1-й канал:


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

2-й канал:


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

3-й канал:


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

Находим H

max=2 и Vmax=2. Канал i будет прорежен в Hmax/Hi раз по горизонтали и Vmax/Vi раз по вертикали.


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

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


  • [00 15] Длина: 21 байт
  • [0_] Класс: 0 (0 — таблица DC коэффициентов, 1 — таблица AC коэффициентов).
  • [_0] Идентификатор таблицы: 0

Следующие 16 значений:

Длина кода Хаффмана: 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.

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

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


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

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


  • [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] — Start of spectral or predictor selection, End of spectral selection, Successive approximation bit position. Эти значения используются только для прогрессивного режима, что выходит за рамки статьи.

Отсюда и до конца (маркера [FF D9]) закодированные данные.


Закодированные данные

Последующие значения нужно рассматривать как битовый поток. Первых 33 бит будет достаточно, чтобы построить первую таблицу коэффициентов:


Нахождение DC-коэффициента

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

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

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


Нахождение AC-коэффициентов

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

2) Берем значение узла. Если оно равно 0, это означает, что оставшиеся значения матрицы нужно заполнить нулями. Дальше закодирована уже следующая матрица. В нашем случае значение узла: 0x31.


  • Первый полубайт: 0x3 — именно столько нулей мы должны добавить в матрицу. Это 3 нулевых коэффициента.
  • Второй полубайт: 0x1 — длина коэффициента в битах. Читаем следующий бит.


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

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

и матрицу:

[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] [-4  2  2 1 0 0 0 0]
[ 0  0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0] [-1  0 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -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]
[ 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]
[ 0  0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0] [-1  0 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -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]
[ 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:

[-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]

Вычисления


Квантование

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

[320    0  300 0 0 0 0 0] [-320  110 100 160 0 0 0 0]
[  0  120  280 0 0 0 0 0] [   0    0 140   0 0 0 0 0]
[  0 -130 -160 0 0 0 0 0] [   0 -130   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] [   0    0   0   0 0 0 0 0]

[ 480 -110  100 0 0 0 0 0] [-160  220  200 160 0 0 0 0]
[-120 -240 -140 0 0 0 0 0] [-120    0 -140   0 0 0 0 0]
[   0 -130    0 0 0 0 0 0] [-140 -130    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] [   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 — строка. Cx = 1/√2 для x = 0, а в остальных случаях = 1. syx — непосредственно значения каналов.

Приведу результат вычисления только первой матрицы канала 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]

и для 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]

Ко всем полученным значениям нужно прибавить по 128, а затем ограничить их диапазон от 0 до 255:

Y  = min(max(0, Y  + 128), 255)
Cb = min(max(0, Cb + 128), 255)
Cr = min(max(0, Cr + 128), 255)

Например: 138 → 266 → 255, 92 → 220 → 220 и т. д.


YCbCr в RGB

4 матрицы Y, и по одной Cb и Cr, так как мы прореживали каналы и 4 пикселям Y соответствует по одному Cb и Cr. Поэтому вычислять так: YCbCrToRGB(Y[y,x], Cb[y/2, x/2], Cr[y/2, x/2]):

function YCbCrToRGB(Y, Cb, Cr)
{
    R = round(Y                      + 1.402   * (Cr-128))
    G = round(Y - 0.34414 * (Cb-128) - 0.71414 * (Cr-128))
    B = round(Y + 1.772   * (Cb-128)                     )

    R = min(max(0, R), 255)
    G = min(max(0, G), 255)
    B = min(max(0, B), 255)

    return R, G, B
}

// Псевдокод для нашего рисунка
for (y = 0; y < 16; ++y)
    for (x = 0; x < 16; ++x)
        R, G, B = YCbCrToRGB(Y[y,x], Cb[y/2, x/2], Cr[y/2, x/2])

Вот полученные таблицы для каналов R, G, B для левого верхнего квадрата 8×8 нашего примера:

R:
255 249 195 149 169 215 255 255
255 238 172 116 131 179 255 255
255 209 127  58  64 112 209 255
255 224 143  73  76 120 212 255
217 193 134  84  86 118 185 223
177 162 147 132 145 162 201 218
 57  74 101 125 144 146 147 142
  0  18  76 125 153 146 128 108

G:
220 186 118  72  67 113 172 205
220 175  95  39  29  77 139 190
238 192 100  31  16  64 132 185
238 207 116  46  28  72 135 186
255 242 175 125 113 145 193 231
226 211 188 173 172 189 209 226
149 166 192 216 230 232 225 220
 73 110 167 216 239 232 206 186

B:
255 255 250 204 179 225 255 255
255 255 227 171 141 189 224 255
255 255 193 124  90 138 186 239
255 255 209 139 102 146 189 240
255 255 203 153 130 162 195 233
255 244 216 201 189 206 211 228
108 125 148 172 183 185 173 168
 32  69 123 172 192 185 154 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]

JPG — Изображение в формате JPEG

Расширение JPG

Чем открыть файл JPG

В Windows: Microsoft Windows Photo Viewer, Microsoft Paint, Adobe Photoshop CS5, Adobe Photoshop Elements 10, Adobe Illustrator CS5, CorelDRAW Graphics Suite X5, Corel PaintShop Pro X4, ACDSee Photo Manager 14, ACD Systems Canvas 12, Laughingbird The Logo Creator, Roxio Creator 2012, Axel Rietschin FastPictureViewer, Zoner Photo Studio, IrfanView, Adobe Fireworks, PhotoOnWeb, Artweaver, Ability Photopaint, любой другой графический редактор, любой другой вэб-браузер
В Mac OS: Apple Preview, Adobe Photoshop CS5, Adobe Photoshop Elements 10, Adobe Illustrator CS5, ACDSee Pro for Mac, Laughingbird The Logo Creator, Roxio Toast 11, Fireworks for Mac, Adobe Creative Suite for Mac, Flare for Mac, любой другой графический редактор, любой другой вэб-браузер
В Linux: GIMP, Gwenview
Кроссплатформенное ПО: XnView, Paint.NET, Google Picasa, GIMP, Easy-PhotoPrint EX

Описание JPG

Популярность:

Раздел: Растровая графика

Разработчик: Joint Photographic Experts Group

Файл с расширением JPG – это тоже самое, что и JPEG. Термин JPEG на самом деле – это сокращение от «Совместная группа экспертов фотографии» (Joint Photographic Experts Group), потому что это название комитета, который разработал формат. Но Вы не обязаны это помнить, т.к. редко кто об этом знает. Вместо этого, помните, что JPEG представляет собой сжатый формат файла изображения. JPEG изображения не ограничены определенным количеством цветов, как GIF формат. Таким образом, формат JPEG лучше для сжатия фотографий. Так что, если вы увидите большое, красочное изображение в Интернете, то, скорее всего файла в формате JPEG.

JPEG основан на 24-битной цветовой палитре и поддерживает 16,7 млн. цветов. Однако это формат сжатия с потерями, а это значит, что часть информации теряется при сжатии. Степень сжатия может быть в диапазоне от 10:1 до 20:1, и большинство графических прикладных программ (например, Adobe Photoshop) позволяют выбрать степень сжатия.

Формат JPEG файлов лучше всего подходит для цифровой фотографии, где типичная скорость сжатия с очень низким уровнем потери качества составляет около 10:1. Как GIF, JPEG, это кроссплатформенная, то есть тот же файл будет выглядеть так же, как на Mac и PC.

Mime тип: image/jpeg, image/jpg, application/jpg, application/x-jpg
Hex код: FF D8 FF
ASCII код: JFIF

Форматы изображений: какой из них выбрать?

Предположим, вы только что завершили дизайн-проект, собираетесь сохранить файл, и в этот момент нужно выбрать правильное расширение для файла. Если вы не понимаете разницы между этими форматами, то будет достаточно сложно выбрать из них подходящий, но сегодня мы решили помочь вам, и объяснить одну простую вещь:

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

Постараемся выяснить, какие форматы изображений нам могут пригодиться.

Чтобы действительно понять разницу между типами изображений, для начала нужно выяснить, чем отличаются растровые изображения от векторных.

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

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

Векторные изображения на самом деле являются не совсем изображениями, – это нечто вроде математических формул, напрямую взаимодействующих с компьютером, сообщая ему координаты фигур, которые нужно отобразить. Благодаря этому, векторные изображения можно масштабировать без потери качества, так как формула просто-напросто подстраивается под необходимые размеры конечного рисунка.

Векторные изображения используются для создания текстов и логотипов, и они не способны отобразить комплексные графические продукты вроде фотографий. Обычно они используются как рабочие файлы, которые позже конвертируют в растровые изображения для сайтов. Но с их помощью также можно разрабатывать графику для последующей печати:

Классификация основных типов файлов, используемых в печати и веб-дизайне, подразумевает нечто большее, чем простое разделение на вектор и растр. Как растр, так и вектор – это лишь два крупных семейства, которые насчитывают множество различных форматов изображений с разными преимуществами, недостатками и предназначением.


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

Именно благодаря маленькому размеру файлов, JPEG часто используется в веб-дизайне, так как это положительно влияет на скорость загрузки страниц. JPG-формат также широко используется для цифровых фотографий, так как потери в качестве незаметны, а благодаря меньшему размеру на флешке или жестком диске умещается гораздо больше снимков.

Учитывая все эти преимущества, JPG зарекомендовал себя в качестве «стандартного» формата для всего, что находится за пределами области дизайна. На практике вам наверняка придется столкнуться с клиентами, которые предоставят собственные логотипы в ужасном качестве или с теми, кто предпочитает работать исключительно с этим форматом, потому что знают только его. Сделайте все возможное, чтобы привлечь их внимание к другим, более подходящим, форматам.


Кажется, никто и никогда так и не произнес название этого формата правильно. Дизайнеры часто четко произносят первую букву G или диктуют все три буквы по очереди, однако его создатель, Стив Уилхайт, утверждает, что правильно произносить название как «джив». Хотя его аббревиатура расшифровывается как Graphics Interchange Format («формат для обмена изображениями»), а сам он главным образом используется в веб-дизайне.

Преимущество GIF (которое также отличает его от остальных веб-форматов для изображений) в том, что эти картинки можно анимировать.

Кроме того, GIF поддерживает прозрачность, что иногда позволяет существенно снизить вес файлов. Однако понятие маленького веса относительно, так как чем больше цветов используется, тем больше будет весить файл. Также важно учитывать количество кадров, так как каждый кадр также влияет на вес файла и увеличивает время загрузки веб-страницы.


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

Основной недостаток PNG — большой размер файла, а это отрицательно сказывается на скорости загрузки сайта. Этот формат лучше всего использовать выборочно для элементов, где требуется высокое качество, которое JPG и GIF не способны предложить (например, высококачественные логотипы). PNG также относится к растровым форматам изображений, поэтому при масштабировании таких файлов вы рискуете потерять качество.


TIFF (иногда TIF) – формат файла без сжатия, а это значит, что при сохранении он вообще не подвергается компрессии. TIFF также поддерживает послойную структуру.

Этот формат зачастую называют «готовым к печати» хотя большинство принтеров лучше работают с родными типами файлов вроде AI и PSD.

Кроме того, TIFF слишком тяжелый формат для веб-дизайна. А размеры файлов могут отпугнуть неопытных клиентов, так что постарайтесь подготовить проекты в более распространенных форматах.


PSD представляет собой родной формат программы Adobe Photoshop. Это значит, что беспрепятственно редактировать эти файлы можно только в Photoshop.

PSD нельзя использовать на страницах сайта, и мы настоятельно не рекомендуем вам высылать клиентам превью дизайнов в этом формате. Однако он отлично подходит для последующей печати или для обмена файлами проектами с другими дизайнерами.


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

Файлы в EPS-формате готовы к печати, однако, это не тот формат, который нужно использовать в веб-дизайне. Зачастую после утверждения дизайна страницы его составные элементы конвертируются в PNG, JPG и GIF.

Элементы дизайна, сохраненные в формате EPS, можно открыть в любом редакторе с поддержкой векторной графики. Следовательно, EPS больше подходит для обмена файлами с клиентами, печати на принтере или для совместной работы над проектом с другими дизайнерами.


AI – еще один брендовый векторный формат от Adobe, предназначенный для работы в программе Illustrator. AI-файл нельзя встраивать в веб-страницы, и это не тот формат, который используется для отправки проектов клиенту. Но он хорошо подходит для внутреннего использования и для печати.
PDF-формат от Adobe идеально подходит как для печатной продукции, так и для цифрового использования. Это формат, с которым «справится» любой клиент, и который без проблем можно распечатать на принтере. В PDF-документ можно поместить как растровые, так и векторные изображения, или даже комбинировать их в едином документе.

Конечно, придется сильно постараться, чтобы качественно отобразить содержимое PDF-документа на странице сайта, однако можно реализовать его скачивание. Этот формат также идеально подходит для отправки клиентам превью финального результата.

Однако PDF больше подходит для печатных продуктов вроде книг, брошюр или листовок.


В процессе работы над дизайном печатной продукции, вам, возможно, придется прыгать от одного формата к другому. Иногда нужно поместить JPG-фотографии и EPS-логотип в общий проект, работа над которым ведется в PSD-файле в Photoshop.

Хорошо то, что у каждого формата изображений есть сильные стороны, и опытный дизайнер знает, как из них извлечь выгоду. Велика вероятность, что один и тот же элемент дизайна понадобится вам в разных форматах: основной исходник логотипа будет храниться в EPS-формате, его PNG-версия будет использоваться на сайте, а анимированная GIF-версия припасена для особых случаев.

При помощи Photoshop и Illustrator вы можете сохранять и конвертировать изображения практически в любые форматы. Но стоит отметить, что сохранение картинки с низким разрешением в какой-то специфический формат не поможет вам улучшить его качество. А вот сохранение высококачественного изображения в формат с использованием сжатия приведет к потере качества.

Конвертировать векторное изображение в растровое очень просто – нужно указать желаемый растровый формат при сохранении. Однако такое действие сожмет векторы в пиксели, а это значит, что вы больше не сможете «безболезненно» масштабировать сохраненное изображение, поэтому мы рекомендуем на всякий случай оставить копию исходного файла.

Конвертирование растрового изображения в векторное – это целая наука. Нет простого способа конвертировать пиксели растрового изображения в формулы, генерирующие векторы. Самый проверенный способ – это просто перерисовать картинку при помощи векторов.

JPG — формат файла. Чем открыть JPG?

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

Аббревиатура в расширении файлов JPG (оно же — JPEG) расшифровывается как Joint Photographic Experts Group. Формат был введен в 1994 году. В таких файлах содержатся сжатые растровые изображения: при JPEG-сжатии используется дискретное косинусное преобразование и применяется алгоритм кодирования Хаффмана.

Что находится в файлах .JPG

В файлах JPEG также имеются метаданные изображения в виде тегов EXIF. Эти теги содержат данные о названии изображения, дате создания, параметрах камеры – таких, как диафрагма объектива, скорость затвора, расстояние фокусировки и т. д. Формат Jpg популярен в геотегинге (это добавление географических координат в EXIF, которое выполняется в программе-редакторе или прямо на цифровой камере, если в нее встроен GPS).

Изображения JPEG могут иметь встроенную в них информацию о цветовом пространстве в виде профиля ICM. Эти данные используются устройствами – такими, как мониторы и принтеры – для правильного отображения цветовых тонов на изображении. Не все программное обеспечение поддерживает или правильно обрабатывает встроенный цветовой профиль.

Как открыть файл JPG

Существует множество приложений, поддерживающих просмотр и редактирование JPG файлов и работающих практически во всех современных операционных системах – ACDSee, Adobe Protoshop, FastStone Image Viewer и т.д. JPG файлы широко распространены, потому что алгоритм сжатия значительно уменьшает размер файла, что делает его идеальным для совместного использования, хранения и отображения на веб-сайтах. Хотя иногда сжатие может привести к потере качества.

Вы можете открыть и скачать JPG с помощью любых браузеров – таких, как Chrome или Firefox (нужно лишь перетащить изображение из окна Проводника в новую вкладку браузера и открыть Jpg онлайн). Также для просмотра и элементарного редактирования можно использовать стандартные программы Windows – Просмотр фотографий и Paint. В операционной системе Mac OS эти функции выполняют Apple Preview и Apple Photos.

В чем разница между «JPG» / «JPEG» / «PNG» / «BMP» / «GIF» / «TIFF» образ?

Вы должны знать о нескольких ключевых факторах…

Во-первых, существует два типа сжатия: без потерь и с потерями .

Lossless означает, что изображение делается меньше, но без ущерба для качества. Потеря означает, что изображение делается (даже) меньше, но в ущерб качеству. Если вы сохраняете изображение в формате с потерями снова и снова, качество изображения будет становиться все хуже и хуже.

Существуют также различные глубины цвета (палитры): индексированный цвет и прямой цвет .

С индексированным это означает, что изображение может хранить только ограниченное количество цветов (обычно 256), которые выбраны автором изображения, с прямым это означает, что вы можете хранить многие тысячи цветов, которые не были выбраны автором.


BMP — без потерь / индексированный и прямой

Это старый формат. Это без потерь (никакие данные изображения не теряются при сохранении), но также практически нет сжатия вообще, что означает сохранение как BMP приводит к VERY большим размерам файлов. Он может иметь палитры как индексированные, так и прямые, но это небольшое утешение. Размеры файлов настолько неоправданно велики, что никто никогда по-настоящему не использует этот формат.

Хорошо для: на самом деле ничего. Нет ничего такого, в чем BMP преуспел бы или что не было бы сделано лучше другими форматами.


GIF — только без потерь / индексируется

GIF использует сжатие без потерь, что означает, что вы можете сохранять изображение снова и снова и никогда не терять никаких данных. Размеры файлов намного меньше, чем BMP, потому что на самом деле используется хорошее сжатие, но оно может хранить только индексированную палитру. Это означает, что в файле может быть не более 256 различных цветов. Это звучит как совсем небольшая сумма, и это так.

GIF изображения также могут быть анимированы и иметь прозрачность.

Хорошо подходит для: логотипов, линейных рисунков и других простых изображений, которые должны быть маленькими. Только действительно используется для веб-сайтов.


JPEG -С Потерями / Прямой

JPEGs изображения были разработаны для того, чтобы сделать детальные фотографические изображения как можно меньше, удалив информацию, которую человеческий глаз не заметит. В результате это формат с потерями, и сохранение одного и того же файла снова и снова приведет к потере большего количества данных с течением времени. Он имеет палитру из тысяч цветов и поэтому отлично подходит для фотографий, но сжатие с потерями означает, что это плохо для логотипов и линейных рисунков: они не только будут выглядеть нечеткими, но и такие изображения будут иметь больший размер файла по сравнению с GIFs!

Хорошо для: фотографий. Кроме того, градиенты.


PNG-8 — Без Потерь / Индексированный

PNG-это более новый формат, а PNG-8 (индексированная версия PNG) — действительно хорошая замена GIFs. К сожалению, однако, у него есть несколько недостатков: во-первых, он не может поддерживать анимацию, как GIF can (ну, он может, но только Firefox, кажется, поддерживает ее, в отличие от GIF animation, которая поддерживается каждым браузером). Во-вторых, у него есть некоторые проблемы с поддержкой старых браузеров, таких как IE6. В-третьих, важные программы, такие как Photoshop, имеют очень плохую реализацию формата. (Черт бы тебя побрал, Adobe!) PNG-8 может хранить только 256 цветов, как GIFs.

Хорошо для: главное, что PNG-8 делает лучше, чем GIFs, — это поддержка Альфа-прозрачности.

Важное примечание: Photoshop не поддерживает Альфа-прозрачность для файлов PNG-8. (Черт бы тебя побрал, Photoshop!) Однако есть способы конвертировать файлы Photoshop PNG-24 в PNG-8, сохраняя при этом их прозрачность. Один метод- PNGQuant, другой-сохранить ваши файлы с помощью фейерверка .


PNG-24 — Без Потерь / Прямой

PNG-24-это отличный формат, который сочетает в себе кодирование без потерь с прямым цветом (тысячи цветов, как и JPEG). В этом отношении он очень похож на BMP, за исключением того, что PNG на самом деле сжимает изображения, поэтому он приводит к гораздо меньшим файлам. К сожалению, файлы PNG-24 все равно будут намного больше, чем JPEGs, GIFs и PNG-8s, поэтому вам все равно нужно подумать, действительно ли вы хотите их использовать.

Несмотря на то, что PNG-24s допускают тысячи цветов при сжатии, они не предназначены для замены изображений JPEG. Фотография, сохраненная как PNG-24, скорее всего, будет по крайней мере в 5 раз больше, чем эквивалентное изображение JPEG, что очень мало улучшит видимое качество. (Конечно, это может быть желательным результатом, если вы не беспокоитесь о размере файла и хотите получить изображение самого высокого качества, какое только можете.)

Как и PNG-8, PNG-24 также поддерживает Альфа-прозрачность.

Надеюсь, это поможет!

Чем отличаются форматы изображений и зачем они нужны

Вадим Сычёв

Одно и то же изображение в разных форматах может иметь разный размер и разное качество. Почему так, для чего используются разные форматы и чем они отличаются — разбираемся в статье.

RAW

Это необработанный файл изображения без сжатия. Вы получаете файлы RAW, делая снимки на цифровом зеркальном фотоаппарате. По этой причине такие файлы огромны — каждый из них легко может занимать 25 МБ. Это подходит для редактирования фотографий, но не для их хранения, поэтому и существует сжатие изображений.

В статье будет использоваться одна и та же фотография для сравнения. В браузере нельзя отобразить её в формате RAW, но просмотр высококачественных фотографий в формате JPEG или PNG должен дать представление о том, как выглядит оригинал. Также для сравнения необработанный файл этой фотографии имеет размер 12,4 МБ.

JPEG

Наиболее распространённый формат изображений JPEG (или JPG) является стандартом организации Joint Photographic Experts Group и часто используется для публикации фотографий и изображений текста в интернете. Формат поддерживает 24 бита на пиксель, по 8 для зелёного, синего и красного, что делает этот формат «truecolor», который может отображать более 16 000 000 цветов.

JPEG способен создавать изображения высокого качества, но это всё равно формат сжатия с потерями. Вот почему вы часто будете видеть варианты «низкое», «среднее» и «высокое» качество при экспорте изображения в формате JPEG. Каждый параметр уменьшает степень сжатия и повышает качество фотографии. Вот фотография в форматах JPEG высокого, среднего и низкого качества с соответствующими размерами.

JPEG высокого качества (качество установлено на 100), размер: 471 КБ

JPEG среднего качества (установлено качество 50), размер: 68 КБ

JPEG низкого качества (качество установлено до 20), размер: 32 КБ

Высококачественный JPEG обычно является хорошим компромиссом между размером и качеством. Однако, как только вы создаёте JPEG среднего и низкого качества, изображение значительно ухудшается. Кроме того, JPEG лучше всего подходит для фотографий или рисунков, у которых меньше резких переходов, чем у текста.

GIF

Graphics Interchange Format (GIF) допускает 8 бит на пиксель, по три на красный и зелёный и два на синий. Поэтому GIF-файлам доступны 256 цветов, хотя можно получить и больше, используя несколько цветовых блоков с различными 256-цветными палитрами. При сжатии без потерь GIF-файлы могут идеально воспроизводить свои ограниченные цветовые палитры при многократном повторном сжатии.

Вот тестовая фотография в кодировке GIF:

Размер GIF: 194 КБ

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

Другая важная вещь, которую нужно знать о GIF-файлах, заключается в том, что они могут быть анимированными, чему можно найти множество интересных применений. Используя несколько кадров изображения, нарисованных по порядку, можно создать видимость движения. Помимо создания анимации, формат GIF редко используется из-за его ограниченного цветового пространства.
Более подробно ознакомиться с вариантами использования анимированных GIF-файлов вы можете, перейдя на эту страницу.

PNG

Тип файла Portable Network Graphics, предназначенный для замены GIF, — это ещё один формат сжатия без потерь. Он содержит значительно больше информации, чем его предшественник: 24 или 32 бита на пиксель. 24-разрядная версия содержит информацию RGB, а 32-разрядная использует цветовое пространство RGBA. «A» в RGBA означает «альфа», что обеспечивает разные уровни прозрачности изображения (клетчатый фон, как на рисунке ниже, обычно указывает на прозрачность).

Поскольку PNG-файл содержит гораздо больше информации, он будет немного больше, чем JPEG или GIF.

Размер PNG: 1,5 МБ

Эта фотография PNG выглядит не лучше, чем высококачественный JPEG, хотя важно помнить, что сжатие без потерь будет поддерживать качество фотографии при многократном повторном сжатии. Кроме того, если важна прозрачность, PNG — верное решение.

TIFF

The Tagged Image File Format изначально разрабатывался для сканеров и становился всё более сложным по мере того, как сканеры переходили от чёрно-белого к полутоновому и до полноцветного изображения. Теперь это широко используемый полноцветный тип файла. TIFF-файлы могут быть сохранены в сжатом или несжатом виде, а используемое сжатие может быть с потерями или без. В большинстве случаев будет использоваться сжатие без потерь, хотя, если размер важен, можно пожертвовать качеством.
Поскольку TIFF технически является обёрткой или контейнером файла, он может сохранять изображения с различными битами на пиксель, предоставляя вам возможность иметь очень большое количество цветов, как это было бы с JPEG или PNG.

Примечание Поскольку поддержка TIFF не универсальна в браузерах, показаны высококачественные JPEG-скриншоты TIFF-файлов.

Несжатый размер TIFF: 2,2 МБ

Размер сжатого файла TIFF: 1,6 МБ

Эти файлы изображений без потерь немного объёмнее, чем форматы JPEG или GIF, но они содержат гораздо больше информации. Хотя в интеренете вы не видите TIFF так же часто, как другие форматы, он очень широко используется и может быть открыт практически любой программой для редактирования изображений.

BMP

Это старый формат, который уже не так часто используется. Из-за проблем с отображением этого формата в браузерах используется скриншот BMP в высококачественном JPEG ниже, чтобы вы могли увидеть, как он выглядит.

BMP (bitmap) — это, прежде всего, формат для Windows, и стандарт поддерживается Microsoft. Как и TIFF, он может хранить произвольное количество бит на пиксель, вплоть до 64, а значит, он содержит много информации об изображении. Этот формат может содержать данные о прозрачности, но некоторые приложения Microsoft не позволяют их читать.

Короче говоря, если у вас есть BMP, конвертируйте его во что-то другое. Всё будет работать лучше.

Размер BMP: 1,1 МБ

Какой формат изображений лучше использовать?

Короткий ответ: для большинства целей PNG — очень достойный вариант. Особенно если изображения большого размера. Например, для печати фотографий размером 8×10 и более. Различие между типами файлов наиболее очевидны на напечатанных фотографиях. А сжатие без потерь означает, что качество будет поддерживаться в течение нескольких циклов сжатия.

JPEG высокого или даже среднего качества, скорее всего, подойдёт, если вам нужна более высокая степень сжатия, например для отправки фотографий по электронной почте.
TIFF в основном полезен, если вы знаете, как настроить определённые параметры. Следует избегать как GIF, так и BMP (если, конечно, вы не создаёте анимированные GIF). Рекомендуется хранить RAW-файлы, чтобы вы всегда могли редактировать свои фотографии прямо из исходника.

Перевод статьи «JPEG, GIF, or PNG? Image Filetypes Explained and Tested»

JPEG против PNG против BMP против GIF против SVG

Вы должны знать о нескольких ключевых факторах …

Во-первых, существует два типа сжатия: Lossless и Lossy .

  • Без потерь означает, что изображение сделано меньше, но без ущерба для качества.
  • Потеря означает, что изображение становится (даже) меньше, но в ущерб качеству. Если вы сохраняете изображение в формате с потерями снова и снова, качество изображения будет становиться все хуже и хуже.

Существуют также разные глубины цвета (палитры): индексированный цвет и прямой цвет .

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

BMP — без потерь / индексированный и прямой

Это старый формат. Это без потерь (никакие данные изображения не теряются при сохранении), но также практически отсутствует сжатие, что означает сохранение, поскольку BMP приводит к ОЧЕНЬ большим размерам файлов. Он может иметь палитры Indexed и Direct, но это небольшое утешение. Размеры файлов настолько велики, что никто никогда не использует этот формат.

Хорошо для: ничего особенного. В BMP нет ничего превосходного или лучше других форматов.


GIF — без потерь / только индексированный

GIF использует сжатие без потерь, что означает, что вы можете сохранять изображение снова и снова и никогда не потерять какие-либо данные. Размеры файлов намного меньше, чем BMP, потому что на самом деле используется хорошее сжатие, но оно может хранить только индексированную палитру. Это означает, что в большинстве случаев в файле может быть не более 256 разных цветов. Это звучит как довольно небольшое количество, и это так.

Изображения GIF также могут быть анимированными и иметь прозрачность.

Хорошо для: логотипы, линейные рисунки и другие простые изображения, которые должны быть маленькими. Действительно используется только для веб-сайтов.


JPEG — Lossy / Direct

Изображения JPEG были разработаны таким образом, чтобы детализировать фотографические изображения как можно меньше, удаляя информацию, которую человеческий глаз не заметит. В результате это формат с потерями, и сохранение одного и того же файла снова и снова приведет к потере большего количества данных с течением времени. Он имеет палитру тысяч цветов и поэтому отлично подходит для фотографий, но сжатие с потерями означает, что это плохо для логотипов и штриховых рисунков: они не только будут выглядеть нечеткими, но и такие изображения будут иметь больший размер файла по сравнению с GIF-файлами!

Хорошо для: Фотографии. Также градиенты.


PNG-8 — без потерь / индексированный

PNG является более новым форматом, а PNG-8 (индексированная версия PNG) действительно является хорошей заменой GIF-файлам. К сожалению, однако, у него есть несколько недостатков: во-первых, он не может поддерживать анимацию, как GIF (хорошо, может, но, похоже, только Firefox поддерживает ее, в отличие от GIF-анимации, которая поддерживается каждым браузером). Во-вторых, у него есть проблемы с поддержкой старых браузеров, таких как IE6. В-третьих, важные программы, такие как Photoshop, имеют очень плохую реализацию формата. (Черт возьми, Adobe!) PNG-8 может хранить только 256 цветов, как GIF-файлы.

Хорошо: главное, что PNG-8 работает лучше, чем GIF, — это поддержка альфа-прозрачности.

Важное примечание: Photoshop не поддерживает альфа-прозрачность для файлов PNG-8. (Черт возьми, Photoshop!) Однако есть способы конвертировать Photoshop PNG-24 в файлы PNG-8, сохраняя при этом их прозрачность. Один метод — PNGQuant , другой — сохранить ваши файлы с помощью Fireworks .


PNG-24 — без потерь / прямой

PNG-24 — отличный формат, который сочетает в себе кодирование без потерь и прямой цвет (тысячи цветов, как в JPEG). В этом отношении это очень похоже на BMP, за исключением того, что PNG на самом деле сжимает изображения, так что это приводит к гораздо меньшим размерам файлов. К сожалению, файлы PNG-24 по-прежнему будут намного больше, чем JPEG, GIF и PNG-8, поэтому вам все равно нужно подумать, действительно ли вы хотите их использовать.

Несмотря на то, что PNG-24 допускают тысячи цветов при сжатии, они не предназначены для замены изображений JPEG. Фотография, сохраненная в формате PNG-24, вероятно, будет как минимум в 5 раз больше, чем эквивалентное изображение JPEG, с очень небольшим улучшением видимого качества. (Конечно, это может быть желательным результатом, если вас не интересует размер файла, и вы хотите получить максимально качественное изображение).

Как и PNG-8, PNG-24 также поддерживает альфа-прозрачность.


SVG — Lossless / Vector

Тип файла, который в настоящее время становится все более популярным, это SVG, который отличается от всего вышеперечисленного тем, что это векторный формат файла (все вышеупомянутые растровые ). Это означает, что он на самом деле состоит из линий и кривых, а не пикселей. Когда вы увеличиваете векторное изображение, вы все равно видите кривую или линию. При увеличении растрового изображения вы увидите пиксели.

Например:

Это означает, что SVG идеально подходит для логотипов и иконок, которые вы хотите сохранить четкость на экранах Retina или разных размеров.

Кроме того, файлы SVG пишутся с использованием XML, поэтому их можно открывать и редактировать в текстовом редакторе, чтобы им можно было управлять на лету, если вы хотите. Например, вы можете использовать JavaScript для изменения цвета значка SVG на веб-сайте так же, как если бы вы использовали какой-либо текст (т. Е. Нет необходимости во втором изображении).

Надеюсь, это поможет!

Сводка из Энциклопедии форматов графических файлов

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


Тип Растровое изображение
Цвета До 24 бит
Сжатие JPEG
Максимальный размер изображения 64Kx64K пикселей
Числовой формат С прямым порядком байтов
Несколько изображений в файле
Оригинатор Микросистемы C-Cube
Платформа Все
Вспомогательные приложения Слишком много для перечисления
См. Также Глава 9, Сжатие данных (раздел JPEG)

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

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

Спецификации поставщика доступны для этого формата.

Фрагменты кода доступны для этого формата.

Образцы изображений доступны для этого формата.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ: jfif ->


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

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

Файл JFIF — это в основном JPEG поток данных с некоторыми ограничениями и идентифицирующим маркером.Чтобы чтобы понять формат JFIF, вам необходимо понимать JPEG; в добавление к Глава 9, см. FAQ по JPEG Документ (Часто задаваемые вопросы), включенный в CD-ROM и доступен в Интернете.

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

Первые два байта каждого потока JPEG — это Значения маркера начала изображения (SOI) FFh D8h.В JFIF-совместимый файл есть Маркер JFIF APP0 (Application), сразу после SOI, который состоит из значений кода маркера FFh E0h и символы JFIF в данных маркера, как описано в следующем разделе. В добавок к Сегмент маркера JFIF, может быть один или несколько необязательные сегменты маркера расширения JFIF, за которыми следуют фактическими данными изображения.

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

 typedef struct _JFIFHeader
{
  БАЙТ SOI [2]; / * 00h Маркер начала изображения * /
  БАЙТ APP0 [2]; / * 02h ​​Маркер использования приложения * /
  BYTE Length [2]; / * 04h Длина поля APP0 * /
  БАЙТ-идентификатор [5]; / * 06h "JFIF" (завершается нулем) Строка идентификатора * /
  БАЙТОВАЯ версия [2]; / * 07h Версия формата JFIF * /
  Байтовые единицы; / * 09h Используемые единицы разрешения * /
  BYTE Xde density [2]; / * 0Ah горизонтальное разрешение * /
  BYTE Yde density [2]; / * 0Ch вертикальное разрешение * /
  BYTE XThumbnail; / * 0Eh Количество пикселей по горизонтали * /
  BYTE YThumbnail; / * 0Fh Количество пикселей по вертикали * /
} JFIFHEAD;
 

SOI — это начало маркера изображения и всегда содержит код маркера значения FFh D8h.

APP0 — это маркер приложения и всегда содержит код маркера. значения FFh E0h.

Длина — это размер маркера JFIF (APP0). сегмент, включая размер самого поля длины и любых данные миниатюр, содержащиеся в сегменте APP0. Из-за этого значение Length равно 16 + 3 * XThumbnail * YThumbnail.

Идентификатор содержит значения 4Ah 46h 49h 46h 00h (JFIF) и используется для идентификации кодового потока как соответствует спецификации JFIF.

Версия определяет версию JFIF. спецификация, с первым байтом, содержащим основную версию число и второй байт, содержащий младший номер версии. За версия 1.02, значения поля Версия — 01h 02h; старые файлы содержать 01h 00h или 01h 01h.

Единицы измерения, плотность X и плотность Y определяют единицы измерения, используемые для опишите разрешение изображения. Единицы могут быть 01h для точек на дюйм, 02h. для точек на сантиметр или 00h для отсутствия (используйте измерение как пиксель соотношение сторон).Плотность по осям X и Y по горизонтали и вертикали. разрешение данных изображения соответственно. Если значение поля Единицы равно 00h, поля Xde density и Yde density будут содержать пиксельный аспект соотношение (Xde density: Yde density), а не разрешение изображения. Потому что неквадратные пиксели не приветствуются по причинам переносимости, Значения плотности X и Y обычно равны 1, когда значение Units равно 0.

XThumbnail и YThumbnail задают размеры миниатюрного изображения. включен в маркер JFIF APP0.Если нет миниатюры изображение включается в маркер, то в этих полях содержится 0. A уменьшенное изображение — это уменьшенное представление изображения, хранящегося в основной поток данных JPEG (некоторые называют его значком или изображение для предварительного просмотра). Сами данные эскиза состоят из массива XThumbnail * YThumbnail значения пикселей, где каждое значение пикселя занимает три байта и содержит 24-битное значение RGB (хранится в порядке R, G, B). Сжатие эскиза не выполняется изображение.

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

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

 typedef struct _JFIFExtension
{
БАЙТ APP0 [2]; / * 00h Маркер использования приложения * /
BYTE Length [2]; / * 02h ​​Длина поля APP0 * /
БАЙТ-идентификатор [5]; / * 04h "JFXX" (завершается нулем) Строка идентификатора * /
BYTE ExtensionCode; / * 09h Идентификационный код внутреннего абонента * /
} JFIFEXTENSION;
 

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

Длина хранит длину сегмента расширения в байтах.

Идентификатор содержит значения 4Ah 46h 58h 58h 00h (JFXX).

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

Данные расширения соответствуют информации сегмента расширения и различаются по размеру. и содержимое в зависимости от значения ExtensionCode. (См. Текущую спецификацию JFIF для получения информации о возможных форматах сегмента маркера расширения.)

Декодеры JFIF должны быть готовы игнорировать нераспознанные маркеры расширений и сегменты APPn. Зависит от приложения Маркеры APPn, не распознаваемые декодером JPEG, могут можно просто пропустить, используя поле длины данных маркера.

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

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

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

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

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

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

Для получения дополнительной информации о формате файла JFIF, см. спецификацию на компакт-диске. Вы также можете связаться с C-Cube Microsystems по адресу:

C-Cube Микросистемы
Attn: Scott St.Clair
Корпоративные коммуникации
1778 McCarthy Blvd.
Милпитас, Калифорния 95035
Голосовой: 408-944-6300
ФАКС: 408-944-6314

См. Также главу 9 для получения информации о сжатии JPEG. В JPEG FAQ и FAQ по сжатию, также включенный в CD-ROM, содержащий справочную информацию о JPEG.

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

Американский национальный институт стандартов, Inc.
Attn: Продажи
1430 Бродвей
Нью-Йорк, NY 10018
Голосовой: 212-642-4900

Стандарт разделен на две части; Часть 1 — это фактическая спецификация, и Часть 2 посвящена методам тестирования на соответствие. Часть 1 проекта достигла Статус международного стандарта. См. Этот документ:

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

Часть 2 все еще находится в статусе проекта комитета. См. Этот документ:

Цифровое сжатие и кодирование неподвижных изображений с непрерывным тоном Изображения, часть 2: Проверка на соответствие . Номер документа ИСО / МЭК CD 10918-2.

См. Обсуждение JPEG в главе 9 для получения списка дополнительных ссылок, включая имеющиеся в продаже книги, содержащие JPEG спецификация и FAQ по JPEG (Часто задаваемые вопросы).Компакт-диск содержит несколько программ и библиотек JPEG.


Эта страница взята из Энциклопедии форматов графических файлов и имеет лицензию O’Reilly по лицензии Creative Common / Attribution.

Дополнительные ресурсы

JPEG — формат файла изображения

Что такое файл JPEG?

JPEG — это тип формата изображения, который сохраняется с использованием метода сжатия с потерями. Выходное изображение в результате сжатия представляет собой компромисс между размером хранилища и качеством изображения.Пользователи могут настроить уровень сжатия для достижения желаемого уровня качества и в то же время уменьшить размер хранилища. Если к изображению применяется сжатие 10: 1, качество изображения незначительно ухудшается. Чем выше значение сжатия, тем выше ухудшение качества изображения.

Спецификации формата файла

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

Шаги сжатия JPEG

Преобразование: Цветные изображения преобразуются из RGB в изображение яркости / цветности (глаз чувствителен к яркости, а не к цветности, поэтому часть цветности может потерять много данных и, следовательно, может быть сильно сжатой.

Понижающая дискретизация: Понижающая дискретизация выполняется для цветного компонента, а не для компонента яркости. Понижающая дискретизация выполняется либо при соотношении 2: 1 по горизонтали и 1: 1 по вертикали (2h 1 V). Таким образом, изображение уменьшается в размере, поскольку компонент «y» не затрагивается, не происходит заметной потери качества изображения.

Организация в группы: Пиксели каждого цветового компонента организованы в группы размером 8 × 2 пикселя, называемые «единицами данных», если количество строк или столбцов не кратно 8, нижняя строка и крайние правые столбцы дублируются.

Дискретное косинусное преобразование: Затем к каждому блоку данных применяется дискретное косинусное преобразование (DCT) для создания карты преобразованных компонентов 8 × 8. CT включает некоторую потерю информации из-за ограниченной точности компьютерной арифметики. Это означает, что даже без карты будет некоторая потеря качества изображения, но обычно она небольшая.

Квантование: Каждый из 64 преобразованных компонентов в единице данных делится на отдельное число, называемое его «коэффициентом квантования (QC)», а затем округляется до целого числа.Здесь информация теряется безвозвратно. Большой контроль качества приводит к еще большим потерям. В целом, большинство инструментов JPEG позволяют использовать таблицы контроля качества, рекомендованные стандартом JPEG.

Кодирование: 64 квантованных преобразованных коэффициента (которые теперь являются целыми числами) каждой единицы данных кодируются с использованием комбинации кодирования RLE и кодирования Хаффмана.

Добавление заголовка: Последний шаг добавляет заголовок и все используемые параметры JPEG и выводит результат.

Декодер JPEG использует шаги в обратном порядке для создания исходного изображения из сжатого.

Структура файла

Изображение JPEG представлено как последовательность сегментов, каждый из которых начинается с маркера. Каждый маркер начинается с байта 0xFF, за которым следует флаг маркера, представляющий тип маркера. Полезная нагрузка, за которой следует маркер, различается в зависимости от типа маркера. Ниже перечислены распространенные типы маркеров JPEG:

Краткое имя Байт Полезная нагрузка Имя Комментарии
SOI 0xFF, 0xD8 Начальное изображение нет
S0F0 0xFF, 0xC0 переменный размер Начало кадра
S0F2 0xFF, 0xC2 переменный размер Начало кадра
переменный размер Определить таблицы Хаффмана
DQT 0xFF, 0xDB переменный размер Определить таблицу (таблицы) квантования
DRI 0xFF12 по умолчанию, 0xDDD Интервал
SOS 0xFF, 0xDA переменный размер S tart Of Scan
RSTn 0xFF, 0xD // n // (// n // # 0..7) нет Перезапустить
APPn 0xFF, 0xE // n // переменный размер Для конкретного приложения
COM 0xFF, 0xFE переменный размер переменный размер Комментарий
EOI 0xFF, 0xD9 нет Конец изображения

Внутри данных с энтропийным кодированием после любого байта 0xFF кодировщик вставляет байт 0x00 перед следующим байтом , чтобы не было маркера там, где он не предназначен, что предотвращает ошибки кадрирования.Декодеры должны пропускать этот байт 0x00. Этот метод, называемый байтовым заполнением (см. Раздел F.1.2.3 спецификации JPEG), применяется только к данным с энтропийным кодированием, а не к данным полезной нагрузки маркера. Однако обратите внимание, что данные с энтропийным кодом имеют несколько собственных маркеров; в частности, маркеры сброса (от 0xD0 до 0xD7), которые используются для выделения независимых фрагментов энтропийно-кодированных данных, чтобы обеспечить параллельное декодирование, и кодировщики могут свободно вставлять эти маркеры сброса через равные промежутки времени (хотя не все кодировщики делают это).

JPG Формат подписи: Пример документации и восстановления

Формат подписи JPG: Пример документации и восстановления

JPEG (Joint Photographic Experts Group) — широко используемый метод сжатия с потерями для цифровых изображений, в основном для изображений, созданных с помощью цифровой фотографии.

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

Сжатие

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

JPEG / Exif — наиболее распространенный формат изображения, используемый цифровыми камерами и другими устройствами захвата изображений.

JPEG / JFIF, это наиболее распространенный формат для хранения и передачи фотографических изображений в Интернете.

Файлы

JPEG (сжатые изображения) начинаются с маркера изображения, который всегда содержит шестнадцатеричные значения кода маркера FF D8 FF . В него не встроена длина файла, поэтому нам нужно найти трейлер JPEG, который равен FF D9 .

Рассмотрим пример

При осмотре пример.jpg с помощью любого Hex Viewer, такого как Active @ Disk Editor, мы видим, что он запускается с подписью FF D8 FF :

Он не имеет встроенной длины файла, поэтому нам нужно найти трейлер JPEG, который равен FF D9 . После обнаружения этой подписи по смещению

 0x53C (шестнадцатеричный), 1340 (десятичный): 

.. мы можем определить размер файла, который составляет 1342 байта.

Заголовок файла JPEG:
typedef struct _JFIFHeader
{
  БАЙТ SOI [2]; / * 00h Маркер начала изображения * /
  БАЙТ APP0 [2]; / * 02h ​​Маркер использования приложения * /
  BYTE Length [2]; / * 04h Длина поля APP0 * /
  БАЙТ-идентификатор [5]; / * 06h "JFIF" (завершается нулем) Строка идентификатора * /
  БАЙТОВАЯ версия [2]; / * 07h Версия формата JFIF * /
  Байтовые единицы; / * 09h Используемые единицы разрешения * /
  BYTE Xde density [2]; / * 0Ah горизонтальное разрешение * /
  BYTE Yde density [2]; / * 0Ch вертикальное разрешение * /
  BYTE XThumbnail; / * 0Eh Количество пикселей по горизонтали * /
  BYTE YThumbnail; / * 0Fh Количество пикселей по вертикали * /
} JFIFHEAD;

 

SOI — это начало маркера изображения и всегда содержит значения кода маркера FFh D8h.

APP0 является маркером приложения и всегда содержит значения кода маркера FFh E0h.

Длина — это размер сегмента маркера JFIF (APP0), включая размер самого поля длины и любых данных эскиза, содержащихся в сегменте APP0. Из-за этого значение Length равно 16 + 3 * XThumbnail * YThumbnail.

Идентификатор содержит значения 4Ah 46h 49h 46h 00h (JFIF) и используется для идентификации кодового потока как соответствующего спецификации JFIF.

Версия определяет версию спецификации JFIF, при этом первый байт содержит номер основной версии, а второй байт — номер дополнительной версии. Для версии 1.02 значения поля Версия: 01h 02h; более старые файлы содержат 01h 00h или 01h 01h.

Пример настраиваемого сценария Active @ File Recovery

Этот поиск сигнатур может быть написан по сценарию с использованием языка определения сигнатур, который используется в Active @ File Recovery.Синтаксис языка определения подписи вы можете прочитать здесь.

[PRIMITIVE_JPG]
BEGIN = BEGIN.TEST.JPG
ГРУППА = изображения и файлы RAW с камеры
ОПИСАНИЕ = примитивные файлы JPG
FOOTER = FOOTER-.TEST.JPG
РАСШИРЕНИЕ = test.jpg
MAX_SIZE = 3221225472

[BEGIN.TEST.JPG]
\ xFF \ xD8 \ xFF = 0 | 0

[FOOTER-.TEST.JPG]
\ xFF \ xD9
 

Метаданные в файлах JPEG

В этой статье рассказывается об исследованиях Туана (GSoC13 Student) о структуре метаданных в файлах JPEG.Он также кратко представляет алгоритм, используемый в exiv2 для чтения и записи данных Exif, IPTC, XMP и комментариев к изображениям в файлах JPEG.

1. Предпосылки

Стандарт

JPEG ISO — это широко используемый метод сжатия с потерями для цифровой фотографии. Название «JPEG» расшифровывается как Joint Photographic Experts Group, название комитета.

JPEG относится только к классу алгоритмов сжатия, а не к конкретному формату файла. Для создания файлов со встроенными потоками JPEG был адаптирован или разработан ряд стандартов форматов файлов.Некоторые из них: JPEG / JFIF , JPEG / SPIFF (формат файла обмена неподвижными изображениями), JPEG / CIFF , JPEG / Exif (формат файла сменного изображения).

Среди них наиболее распространены типы JPEG / Exif и JPEG / JFIF.
  • JPEG / Exif — наиболее распространенный формат изображения, используемый цифровыми камерами и другими устройствами захвата фотографических изображений.
  • JPEG / JFIF — наиболее распространенный формат для хранения и передачи фотографических изображений во всемирной паутине.

2.Структура метаданных в формате JPEG¶

Файл JPEG состоит из нескольких сегментов; каждый сегмент содержит разные виды данных, разделенных двухбайтовыми кодами, называемыми маркерами. Маркеры шестнадцатеричные; они начинаются с 0xFF и заканчиваются кодом (1 байт), указывающим тип маркера.

Некоторые маркеры состоят только из этих двух байтов; за другими следуют два байта, указывающие длину следующих за ними данных полезной нагрузки, специфичных для маркера. Длина включает два байта длины, но не два байта маркера.

Краткое наименование байтов Полезная нагрузка Имя и комментарии
SOI 0xFF, 0xD8 Нет Начало изображения
SOF0 0xFF, 0xC0 Изменяемый размер Начало кадра (базовый DCT)
Указывает, что это JPEG на основе базового DCT, и определяет ширину, высоту, количество компонентов и подвыборку компонентов
SOF2 0xFF, 0xC2 Изменяемый размер Начало кадра (прогрессивный DCT)
Указывает, что это JPEG на основе прогрессивного DCT, и определяет ширину, высоту, количество компонентов и подвыборку компонентов
DHT 0xFF, 0xC4 Изменяемый размер Определение таблиц Хаффмана
DQT 0xFF, 0xDB Изменяемый размер Определить таблицу (ы) квантования
DRI 0xFF, 0xDD 2 байта Определить интервал перезапуска
Задает интервал между маркерами RSTn в макроблоках.За этим маркером следуют два байта, указывающие фиксированный размер, поэтому его можно рассматривать как любой другой сегмент переменного размера.
SOS 0xFF, 0xDA Изменяемый размер Начало сканирования
Начинает сканирование изображения сверху вниз. В базовых изображениях DCT JPEG обычно выполняется одно сканирование. Изображения Progressive DCT JPEG обычно содержат несколько сканированных изображений. Этот маркер указывает, какой фрагмент данных он будет содержать, за ним сразу следуют энтропийно-кодированные данные.
РСТн 0xFF, 0xDn
n (n = 0..7)
Нет Перезапуск
Вставляется каждые r макроблоков, где r — интервал перезапуска, установленный маркером DRI. Не используется, если не было маркера DRI. Младшие 3 бита цикла кода маркера имеют значение от 0 до 7.
APPn 0xFF, 0xEn Изменяемый размер Для конкретного приложения
Например, файл Exif JPEG использует маркер APP1 для хранения метаданных, размещенных в структуре, основанной на TIFF.
COM 0xFF, 0xFE Изменяемый размер Комментарий
EOI 0xFF, 0xD9 Нет Конец изображения

Рис.1. Обычные маркеры JPEG. Из Википедии, https://en.wikipedia.org/wiki/JPEG

Метаданные в файле JPEG хранятся в сегменте APPn (0xFF, 0xEn), а комментарий сохраняется в сегменте COM (0xFF, 0xFE).Несколько поставщиков могут использовать один и тот же тип маркера APPn для включения своей информации, поэтому эти маркеры часто начинаются с имени поставщика (например, «Exif» или «Adobe») или какой-либо другой идентифицирующей строки.

Exiv2 обеспечивает быстрый и легкий доступ для чтения и записи к Exif, IPTC и XMP. Следовательно, в этой статье основное внимание уделяется положению данных Exif, IPTC и XMP в файлах JPEG.

2.1 Exif¶

Файл

Exif JPEG использует сегмент APP1 для хранения информации (и кратный сегменту APP2 для данных flashPix).В сегменте Exif APP1 хранится большой объем информации о фотографических параметрах цифровых фотоаппаратов, и в настоящее время это предпочтительный способ хранения миниатюрных изображений. Также на нем можно разместить дополнительный раздел с данными GPS. Все подробности о Exif доступны на [[http://www.exif.org/Exif2-2.PDF]]

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

Сегмент Exif APP1 состоит из маркера APP1 (0xFFE1), строки идентификатора Exif («Exif \ 0 \ 0») и самой информации об атрибутах.Строка идентификатора «Exif \ 0 \ 0» используется, чтобы избежать конфликта с другими приложениями, использующими APP1 (например, XMP).

Рис.2. Базовая структура файлов JPEG. С Exif.org, http://www.exif.org/Exif2-2.PDF

Exif не использует сегменты APPn, кроме сегментов APP1, APP2 и COM. Однако некоторые неизвестные APPn все еще могут существовать в файловой структуре, и программы чтения Exif должны пропускать их.

2.2 XMP¶

В типичный отредактированный файл JPEG информация XMP (расширяемая платформа метаданных) обычно включается вместе с Exif и IPTC (данными модели обмена информацией).16-1 байта).

Структуру содержимого пакета можно найти на http://www.w3.org/TR/REC-rdf-syntax/.
Справочный документ для XMP 3.2 можно загрузить с веб-сайта Adobe Systems Incorporated http://xml.coverpages.org/xmp.html

Когда Adobe впервые представила XMP, он должен был полностью содержать блок XMP в одном сегменте JPEG. Итак, XMP / xml не может быть длиннее 65 КБ. В 2010 году стандарт был обновлен и теперь содержит механизм, с помощью которого можно использовать несколько сегментов.

Приложение exiv2 (.exe) в версии 0.25 поддерживает параметр -pX для извлечения пакета RAW XMP / xml из изображения. Параметр -pX поддерживает как односегментный (65k), так и многосегментный стандарт. Однако libexiv2 обычно не поддерживает многосегментный стандарт. Будущая версия после v0.25 будет полностью поддерживать многосегментный XMP.

2.3 IPTC¶

Adobe Photoshop использует сегмент APP13 для хранения неграфической информации, такой как слои, контуры, данные IPTC и многое другое.Содержимое сегмента APP13 формируется маркером APP1 (0xFFE1), строкой идентификатора (обычно «Photoshop 3.0 \ 000», но также «Adobe_Photoshop2.5:», используемой более ранними версиями), за которой следует последовательность блоков данных ресурса. В общем, ресурсный блок содержит всего несколько байтов, но есть важный блок IPTC, который может быть довольно большим. Блок IPTC может не помещаться в один сегмент APP13, поэтому его можно разделить на несколько сегментов APP13.

Справочный документ для файлового формата Photoshop доступен по адресу http: // www.adobe.com/devnet-apps/photoshop/fileformatashtml/

2,4 ICC¶

Профиль ICC хранится в одном или нескольких блоках APP2. Хотя многие профили ICC имеют небольшой размер, они также могут быть больше, чем один фрагмент. Чанки ограничены двухбайтовой длиной блока 65535 байтами. Для решения этой проблемы данные ICC APP2 имеют 16-байтовый заголовок, как показано ниже:

байт данные
0..11 ICC_PROFILE \ 0
12 icc количество блоков
13 icc всего блоков

Максимальный размер профиля ICC ограничен 256 * (63535 — 16) = 16 261 888 байт.Это довольно большой профиль!

Первые четыре байта в профиле ICC — это длина файла в кодировке bigEndian.

3. Алгоритмы чтения / записи метаданных Exiv2 JPEG¶

В этом разделе кратко рассказывается об алгоритме, используемом в Exiv2. Для получения дополнительных сведений загрузите исходный код Exiv2 и прочтите код в файле src / jpgimage.cpp.

3.1 Алгоритм чтения¶

Из приведенного выше исследования алгоритм чтения довольно прост.Нам просто нужно пройтись по маркерам, найти и прочитать содержимое сегментов Exif APP1, XMP APP1, IPTC APP13. Все эти сегменты располагаются перед сегментом SOS (за которым сразу следуют данные с энтропийным кодом) и часто располагаются сразу после сегмента SOI (не гарантируется). Следовательно, нет необходимости читать весь файл JPEG, чтобы проверить, существуют ли метаданные или нет; процесс может быть остановлен всякий раз, когда будет обнаружен маркер SOS.

Рис.3. Блок-схема чтения метаданных

Примечания:
  • Стандартные файлы JPEG должны иметь не более одного сегмента Exif APP1 и одного сегмента XMP APP1.Следовательно, если существует более одного сегмента Exif APP1 или один сегмент XMP APP1, exiv2 считывает только первый сегмент.
  • У
  • файлов JPEG может быть несколько комментариев, но на данный момент exiv2 читает только первый (в любом случае у большинства файлов jpeg есть только один).

3.2 Алгоритм записи¶

Общая идея алгоритма записи состоит в том, чтобы найти сегменты Exif APP1, XMP APP1, IPTC APP13, удалить их из файла JPEG и заменить их новыми метаданными. Чтобы немного упростить это, мы согласны со следующими правилами (в любом случае это стандартно для большинства jpeg).
  • Порядок сегментов Exif, XMP, IPTC в выходном файле (независимо от их позиций во входном файле)
    SOI | (APP0) | (Exif App1) | (XMP App1) | (IPTC App13) | … | EOI
  • Сегмент COM расположен непосредственно перед SOFn в выходном файле (независимо от его положения во входном файле).

Рис.4. Схема записи метаданных

Пример 1:
Ниже приведен пример, показывающий изменения в структуре файлов JPEG после writeMetadata.В этом примере после добавления Exif.Photo.UserComment добавляется не только сегмент Exif APP1, но и IPTC APP13 также перемещается сразу после Exif APP1.

$ ./exiv2 -pa test.jpg
Iptc.Application2.RecordVersion Short 1 2
Iptc.Application2.Keywords String 4 2010
Iptc.Application2.Keywords String 10 California
Iptc.Application2.Keywords String 9 Рождество
Iptc.Application2.Keywords String 9 canderson
Iptc.Application2.Keywords String 6 характер
Iptc.Application2.Keywords String 6 зима
Iptc.Application2.Copyright String 12 (C) CANDERSON
$ ./exifprint test.jpg -struc
СТРУКТУРА ФАЙЛА:
маркер | размер | подпись
0xd8
0xe0 16 JFIFHH
0xe2 3160 ICC_PROFILE
                           HLinomntrRGB
0xed 18462 Photoshop 3.08BIM
0xe1 34447 XMP: //ns.adobe.com/xmp/extension/
0xdb 67
0xdb 67
0xc0 17
0xc4 31
0xc4 70
0xc4 29
0xc4 68
0xda 12
0xd9
-----------------
$./ exiv2 -M "добавить Exif.Photo.UserComment Hello" test.jpg
$ ./exifprint test.jpg -struc
СТРУКТУРА ФАЙЛА:
маркер | размер | подпись
0xd8
0xe0 16 JFIFHH
0xe1 66 ExifIIi
0xed 18462 Photoshop 3.08BIM
0xe2 3160 ICC_PROFILE
                           HLinomntrRGB
0xe1 34447 XMP: //ns.adobe.com/xmp/extension/
0xdb 67
0xdb 67
0xc0 17
0xc4 31
0xc4 70
0xc4 29
0xc4 68
0xda 12
0xd9
-----------------
Exif.Image.ExifTag 0x8769 Длинный 1 26
Exif.Photo.UserComment 0x9286 Не определено 13 Здравствуйте!
 

Пример 2:
В этом примере показан вывод с использованием exiv2 (.exe) для v0.25, который имеет параметр -pS для печати структуры файла изображения. Вы можете четко видеть положение блока APP1 Exif, блока APP1 XMP и блока APP13 PhotoShop, в котором размещаются данные IPTC. exiv2 (.exe) также имеет параметр -pX для извлечения необработанного XMP для внешней обработки.Блоки данных Exif и Iptc хранятся с использованием спецификации контейнера TIFF. Пример в документе TIFF показывает, как извлечь и распечатать структуру данных Exif, записанных в формате TIFF. http://dev.exiv2.org/projects/exiv2/wiki/The_Metadata_in_TIFF_files

$ exiv2 -pa ~ / test.jpg
Exif.Image.Make Ascii 18 КОРПОРАЦИЯ NIKON
....
Exif.Thumbnail.YCbCrPositioning Short 1 по центру
Iptc.Envelope.ModelVersion Short 1 4
Iptc.Envelope.CharacterSet String 3% G
Iptc.Application2.RecordVersion Short 1 4
Iptc.Application2.Caption String 27 Офис миссис Джонсон в Остине
Xmp.xmp.Рейтинг XmpText 1 0
Xmp.xmp.ModifyDate XmpText 25 2015-02-13T20: 46: 51-06: 00
Xmp.dc.description LangAlt 1 lang = "x-default" Офис миссис Джонсон в Остине
$ exiv2 -pS ~ / test.jpg
СТРУКТУРА JPEG-ФАЙЛА: / Users / rmills / test.jpg
 адрес | маркер | длина | данные
       2 | 0xd8 СОИ
       4 | 0xe1 APP1 | 14862 | Exif..II * .....................
   14868 | 0xe1 APP1 | 699 | http://ns.adobe.com/xap/1.0/. <
   15569 | 0xe2 APP2 | 4094 | MPF.II * ............... 0100 ....
   19665 | 0xed APP13 | 110 | Photoshop 3.0.8BIM ....... 6 ....
   19777 | 0xdb DQT | 132
   19911 | 0xc0 SOF0 | 17
   19930 | 0xc4 DHT | 418
   20350 | 0xda SOS | 12
837 rmills @ rmillsmbp: ~ / gnu / exiv2 / trunk / website $ exiv2 -pX ~ / test.jpg | xmllint-милый 1 -



  
    
      
        
           Офис миссис Джонсон в Остине 
        
      
    
  


$
 
Примечание:
  • XMP: // нс.adobe.com/xmp/extension/ не является допустимой строкой идентификатора XMP в Exiv2. Допустимая строка должна быть http://ns.adobe.com/xap/1.0/\x00. Следовательно, XMP не отображается в выводе.
  • Test.jpg прикреплен внизу этой вики. Вы можете легко загрузить и воспроизвести приведенный выше пример.

Список литературы¶

Что находится внутри файла JPEG

Карл Сальваджо, Рочестерский технологический институт

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

Формат JPEG (Joint Photographic Experts Group) для хранения изображений представляет собой серию методов, направленных на уменьшение избыточности, присутствующей в большинстве данных изображений. Избыточность определяется как «использование слов или данных, которые могут быть опущены без потери смысла или функции; повторение или избыточность информации» в Оксфордском американском словаре.Цифровые изображения показывают избыточность данных несколькими способами.

Значение яркости или числовое значение двух соседних пикселей чаще всего бывает одинаковым, если не одинаковым, по величине. В этом случае вы чаще всего были бы правы, если бы предполагали, что значение счетчика яркости следующего пикселя в строке элементов изображения было таким же, как значение предыдущего пикселя. Если это действительно так, то можно сказать, что нам не нужно использовать все данные изображения для представления информации на фотографии.Этот конкретный тип избыточности известен как межпиксельная избыточность.

Мы представляем фотографии как цифровые изображения с помощью чисел от 0 (черный) до 255 (белый). Почему такой выбор в пользу весов? Это значения, которые могут храниться в одном байте памяти. Поэтому по замыслу мы используем 8-битные данные (8 бит = 1 байт) для представления яркости каждого пикселя в изображении. Однако это не самый эффективный способ представления этой информации. Клод Шеннон предложил многие элементы, составляющие современную теорию информации, наиболее актуальной для этой проблемы было то, что более эффективно использовать короткие слова для представления более часто происходящих событий и зарезервировать более длинные слова для тех событий, которые происходят реже.«События» Шеннона в случае цифровых изображений — это пиксели с определенными цифровыми счетчиками. Шеннон предложил использовать меньшее количество битов для представления цифровых значений счетчика, которые чаще встречаются в изображении, и большее количество битов для представления тех цифровых счетчиков, которые встречаются реже. Это эффективное средство представления цифровых счетчиков известно как «кодирование» и снижает так называемую избыточность кодирования.

Наконец, зрительную систему человека, сколь бы замечательной она ни была, легко обмануть.Если вы уменьшите количество цифровых значений счета, которые используются для представления шкалы от черного к белому на цифровом изображении, человеческая зрительная система будет медленно улавливать различия. Например, если количество цифровых отсчетов уменьшено с 256 до 64 с использованием прямого квантования на уровне серого, очень немногие наблюдатели заметят разницу (см. Рисунок ниже). Очевидно, это будет зависеть от содержания изображения; однако слабые места зрительной системы человека можно использовать для уменьшения третьего типа избыточности данных в изображениях, известного как психовизуальная избыточность.

(а) б

Рис. 1. Психовизуальная избыточность — разница между цифровыми изображениями и зрительной системой человека часто неразличима. Изображение, представленное на (a), использует 256 уникальных цифровых отсчетов для представления шкалы от черного до белого, в то время как изображение на (b) использует только 64 уникальных значения для представления этой же шкалы.

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

Метод сжатия изображений JPEG состоит из 5 функциональных этапов. Их

  1. преобразование цветового пространства RGB в YCC,
  2. пространственная субдискретизация каналов цветности в пространстве YCC,
  3. преобразование блокированного представления данных пространственного изображения YCC в представление частотной области с использованием дискретного косинусного преобразования,
  4. квантование заблокированных данных частотной области в соответствии с определяемым пользователем фактором качества и, наконец,
  5. кодирование данных частотной области для хранения с использованием кодирования Хаффмана.

Человеческая зрительная система больше полагается на пространственное содержание и остроту зрения, чем на цвет для интерпретации. По этой причине цветная фотография, представленная красным, зеленым и синим изображением, преобразуется в другое цветовое пространство, которое пытается изолировать эти два компонента содержимого изображения; а именно YCC или цветовое пространство яркость / цветность-красный / цветность-синий. Это преобразование цветового пространства выполняется попиксельно, при этом цифровые значения преобразуются в соответствии со следующими правилами.

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

Рис. 3. Преобразование RGB в YCC — исходное изображение RGB и вычисленные изображения яркости (Y), цветности-синего (Cb) и цветности-красного (Cr).

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

Процесс JPEG выполняет субдискретизацию отдельных изображений цветности перед тем, как перейти к половине отдельных строк и столбцов. Поскольку в этих каналах мало пространственных деталей, субдискретизация не отбрасывает много значимых данных. В результате получается одна четверть от количества пикселей в исходных представлениях. Человеческая зрительная система; тем не менее, его легко обмануть, и результирующее изображение с истинными цветами, которое формируется путем инвертирования этого процесса преобразования субдискретизации / цветового пространства, практически неотличимо от оригинала, если не смотреть при очень большом увеличении.

Рис. 4. Обратное преобразование субдискретизации / цветового пространства — Результат (а) обратного преобразования субдискретизации / цветового пространства практически неотличим от исходного изображения, показанного на предыдущем рисунке. Эффекты субдискретизации можно увидеть в подразделах увеличенного изображения, показанных для (b) исходного изображения и результирующего (c) изображения с обратным преобразованием.

Рис. 5. Блоки изображения — небольшой фрагмент ранее показанного изображения, который был сегментирован на блоки размером 8×8 пикселей.

Поскольку первые две фазы процесса JPEG пытаются использовать слабые стороны зрительной системы человека и уменьшить психовизуальную избыточность, следующая фаза пытается использовать межпиксельную избыточность, присутствующую в большинстве данных изображения. Если изображение разбито на небольшие части или блоки, вероятность того, что пиксели в этих блоках будут иметь одинаковые уровни цифрового счета, высока для большинства блоков по всему изображению. Блоки, которые включают высококонтрастные элементы изображения, такие как края, очевидно, не будут демонстрировать такое поведение.

Как видно на предыдущем рисунке, почти половина показанных блоков содержит пиксели телесного тона с очень небольшим количеством высокочастотной информации. Преимущественный результат этого факта состоит в том, что представление данных в частотной области в любом из этих блоков, которое демонстрирует постоянство уровня серого в яркости или цветности, будет состоять из относительно небольшого числа ненулевых или значимых значений. Преобразование частотной области, выбранное членами JPEG, является дискретным косинусным преобразованием (DCT).Это было выбрано по сравнению с более традиционным преобразованием Фурье, поскольку оно дает действительные, а не мнимые коэффициенты преобразования, которые легче сохранить в компактном виде в памяти. Коэффициенты DCT вычисляются для одномерной функции следующим образом.


где M — количество точек в функции f (x). DCT выполняется для двумерных наборов данных как серия последовательных одномерных преобразований строк, а затем и столбцов двумерного массива.Обратное преобразование для возврата данных частотной области в исходное пространство данных пространственного изображения задается как


Итак, для каждого блока пикселей 8×8 в исходных изображениях яркости и цветности вычисляется DCT. Для большинства блоков изображения только небольшое количество из 64 пикселей в блоке 8×8 будет иметь коэффициенты DCT, которые имеют существенное значение. На следующем рисунке показаны результаты преобразования DCT для двух блоков с разной степенью постоянства уровня серого.

Рис. 8. Преобразование DCT — Коэффициенты дискретного косинусного преобразования представляют мощность каждой частоты, присутствующей в блоках фрагментов изображения, показанных на изображениях слева. Изображения в центре представляют собой увеличенную версию показанного блока фрагментов изображения. Изображения справа представляют собой масштабированную визуализацию коэффициентов дискретного косинусного преобразования, показанных в таблицах под каждым набором изображений. Данные, показанные на (a), представляют собой гладкую область в исходном изображении, тогда как данные, показанные на (b), представляют область более высоких частот.

Коэффициенты DCT вычисляются для каждого блока пикселей 8×8 в изображении. К этому моменту весь процесс JPEG полностью обратим, за исключением потерь из-за субдискретизации двух каналов цветности.

Следующим этапом обработки в цепочке вычислений, составляющих сжатие изображений JPEG, является квантование коэффициентов DCT в каждом из блоков 8×8. Именно на этом этапе процесс может достичь максимального сжатия; однако это происходит за счет качества изображения.Весь процесс становится тем, что в сообществе сжатия изображений называют «с потерями». Процесс по-прежнему обратим, однако он больше не может точно воспроизводить исходные данные изображения.

Как мы уже видели, коэффициенты DCT становятся меньше по величине по мере удаления от самой низкочастотной составляющей (всегда расположенной в верхнем левом углу блока 8×8). Квантование коэффициентов DCT масштабирует каждый из коэффициентов DCT с помощью предписанного и уникального коэффициента, сила которого зависит от коэффициента качества, указанного пользователем.Комитет JPEG предписывает для канала яркости и для обоих каналов цветности коэффициенты квантования. Эти коэффициенты масштабирования используются для разделения коэффициентов DCT в каждом блоке 8×8 на коэффициент за коэффициентом. Затем каждый элемент значений масштабированных коэффициентов округляется и преобразуется в целочисленное значение. Коэффициенты масштабирования приведены на следующей иллюстрации.

Рис. 9. Коэффициенты квантования коэффициентов DCT — Коэффициенты квантования коэффициентов дискретного косинусного преобразования даны (a) для использования с каналом яркости и (b) для использования как с каналом цветности-синий, так и с каналами цветности-красный.

Квантованные коэффициенты DCT вычисляются путем применения коэффициентов квантования, представленных как Q, к коэффициентам DCT как

Коэффициент, указанный в этом уравнении, известен как коэффициент масштабирования и выводится из коэффициента качества, указанного пользователем. Коэффициент качества указывается по шкале от 0 до 100, где коэффициент 100 представляет наилучшее качество изображения (наименьшее квантование). Связь между коэффициентом качества, определяемым пользователем, и коэффициентом масштабирования определяется выражением


и проиллюстрировано на следующем графике

Рисунок 11. Масштабные коэффициенты таблицы квантования DCT — Масштабные коэффициенты квантования DCT задаются как функция от указанного пользователем коэффициента качества.

После того, как коэффициенты DCT были масштабированы, квантованы и преобразованы в целочисленные значения, данные готовы для кодирования и хранения. Как указано в начале этого эссе, Шеннон заявил, что наиболее эффективно хранить сообщение, используя самые короткие кодовые слова для наиболее часто встречающихся символов и более длинные кодовые слова для менее вероятных символов.На этом этапе мы подготовили коэффициенты DCT таким образом, чтобы они были готовы для уменьшения избыточности кодирования.

Последним шагом в процессе JPEG является использование кодирования Хаффмана для максимально эффективного представления согласованных коэффициентов DCT. Поскольку полное описание кодирования Хаффмана выходит за рамки данного эссе, читатель может обратиться к множеству веб-сайтов и учебников, которые подробно описывают эту тему. Дэвид Хаффман дает первоначальное описание в своей статье 1952 года в Proceeding of the I.R.E.

Теперь, когда читатель знакомится с внутренней работой JPEG, необходимо упомянуть некоторые из недостатков этого широко используемого метода сжатия изображений.

  1. Этот метод лучше всего применять для фотографий естественных сцен.
  2. Этот метод работает лучше всего, когда допущение о постоянстве уровня серого действительно в блоках изображения 8×8. При нарушении этого предположения этот метод окажется менее эффективным, поскольку обеспечивает меньшее сжатие. Изображения с большим количеством шумов, например те, которые сняты при высоких настройках светочувствительности пленки ISO в условиях низкой освещенности цифровой камерой, не будут сжиматься так же хорошо, как те, которые получают большую экспозицию и содержат меньше шума.
  3. Не рекомендуется использовать JPEG для хранения штриховых рисунков. На изображениях штриховых рисунков есть много областей с постоянным уровнем серого, и это хорошо, но главное, что представляет интерес в этом типе изображения, — это черные линии на белом фоне, которые, как ожидает пользователь, будут четкими и четкими. острый. Использование JPEG приведет к недопустимым артефактам в блоках с высокой контрастностью.
  4. Рис. 12. Эффекты JPEG на штриховой графике — Изображение слева представляет собой исходное цифровое изображение шрифта с засечками в нижнем регистре «а».Изображение справа показывает артефакты, которые видны, когда это изображение сохраняется в виде файла JPEG с заданным пользователем коэффициентом качества 20.

  5. Никогда не используйте JPEG в качестве промежуточного формата хранения. JPEG следует использовать только для хранения окончательного изображения, полученного в результате ваших этапов обработки. Если вы делаете снимок, удалите эффект красных глаз, сделайте края резче, а затем захотите отобразить его в Интернете; JPEG следует использовать только для окончательного хранения обработанного изображения для публикации.
  6. Последнее замечание. Как бы удобно ни было хранить сотни изображений на носителе в вашей цифровой камере, вы можете пересмотреть решение об использовании JPEG в качестве формата хранения по умолчанию (см. Рисунок ниже). Если вы собираетесь обрабатывать изображения после их загрузки с камеры, вы можете рассмотреть возможность использования в камере формата без потерь, такого как TIFF или RAW.

Рисунок 13. Эффекты JPEG — Показаны эффекты использования формата файла JPEG.Изображение, показанное в (а), является исходным изображением. На изображении (b) показаны результаты сжатия JPEG с использованием «среднего» качества цифровой камеры. Изображение (c) показывает результаты сжатия JPEG с использованием настройки «низкого» качества на цифровой камере. Хотя установка более высокого качества не приведет к появлению таких нежелательных изображений, фотограф всегда должен осознавать, что эти блокирующие артефакты 8×8 всегда будут присутствовать в любом изображении, сохраненном в виде файла JPEG с цифровой камеры или сохраненном как обработанный продукт из программы обработки изображений. .

Как работает JPG

, Colt McAnlis

Формат файла JPG был одним из наиболее технологически впечатляющих достижений в области сжатия изображений, появившихся на сцене в 1992 году. С тех пор он стал доминирующей силой в представлении изображений фотографического качества в Интернете. И не зря. Большая часть технологий, лежащих в основе работы JPG, исключительно сложна и требует твердого понимания того, как человеческий глаз приспосабливается к восприятию цветов и краев.

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

THE GIST

Схема сжатия JPG разбита на несколько этапов. На изображении ниже они описаны в общих чертах, и мы рассмотрим каждый этап ниже.

Преобразование цветового пространства

Один из ключевых принципов сжатия данных с потерями заключается в том, что датчики человека не так точны, как компьютерные системы.С научной точки зрения человеческий глаз способен различать только около 10 миллионов различных цветов. Однако есть много вещей, которые могут повлиять на восприятие цвета человеческим глазом; прекрасно подчеркнуты цветовыми иллюзиями или тем фактом, что это платье сломало интернет. Суть в том, что человеческим глазом можно хорошо манипулировать в отношении цветов, которые он воспринимает.

Квантование — это форма этого эффекта при сжатии изображений с потерями, однако JPG использует другой подход к этому: цветовых моделей .Цветовое пространство представляет собой особую организацию цветов, а его цветовая модель представляет математическую формулу для представления этих цветов (например, утроение в RGB или учетверение в CMYK).

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

Например, ниже указан конкретный цвет и его представление в цветовых моделях RGB и CMYK, они одного цвета для человеческого глаза, но могут быть представлены с другим набором числовых значений.

JPG конвертирует из RGB в цветовую модель Y, Cb, Cr; Которая состоит из яркости (Y), синего цвета (Cb) и красного цвета (Cr). Причина этого в том, что психовизуальные эксперименты (то есть то, как мозг работает с информацией, которую видит глаз) демонстрируют, что человеческий глаз более чувствителен к яркости, чем к цветности, а это означает, что мы можем пренебречь большими изменениями цветности, не влияя на нашу восприятие изображения. Таким образом, мы можем вносить агрессивные изменения в каналы CbCr до того, как это заметит человеческий глаз.

Пониженная дискретизация

Одним из интересных результатов цветового пространства YCbCr является то, что результирующие каналы Cb / Cr имеют менее мелкие детали; они содержат меньше информации , чем канал Y.

В результате алгоритм JPG изменяет размер каналов Cb и Cr примерно до ¼ их исходного размера (обратите внимание, в том, как это делается, есть нюанс, который я здесь не рассматриваю …), который называется понижающей дискретизацией .

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

Изображение разделено на блоки пикселей 8×8

С этого момента JPG выполняет все операции с блоками пикселей 8×8. Это сделано потому, что мы обычно ожидаем, что не будет большой разницы по блокам 8×8, даже на очень сложных фотографиях, как правило, есть некоторое самоподобие в локальных областях; это сходство — то, чем мы воспользуемся позже при сжатии.

Стоит отметить, что на данном этапе мы представляем один из первых распространенных «артефактов» кодирования JPG. «Растекание цвета» — это когда цвета по острым краям могут «растекаться» на другую сторону. Это связано с тем, что каналы цветности, которые выражают цвет пикселей, имеют каждый блок из 4 пикселей, усредненных в один цвет, и некоторые из этих блоков пересекают острый край.

Дискретное косинусное преобразование

До этого момента все было довольно легко. Цветовые пространства, понижающая дискретизация и блокировка — простые вещи в мире сжатия изображений.Но теперь … вот настоящая математика.

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

Например, если у нас есть этот график ниже:

Вы можете видеть, что на самом деле это сумма cos (x) + cos (2x) + cos (4x)

. декодирование изображения с учетом ряда функций косинуса в двумерном пространстве. Чтобы продемонстрировать это, я представляю один из самых удивительных GIF-файлов в Интернете: кодирование блока пикселей 8×8 с помощью косинусов в 2D-пространстве:

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

Как вы можете видеть, суммируя различные значения косинуса с весом, мы можем восстановить наше исходное изображение (довольно хорошо …)

Это фундаментальный фон того, как работает дискретное косинусное преобразование. Идея состоит в том, что любой блок 8×8 может быть представлен как сумма взвешенных косинусных преобразований на различных частотах.Хитрость во всем этом состоит в том, чтобы выяснить, какие входы косинуса использовать, и как они должны быть взвешены вместе.

Оказывается, какой косинус использовать? Задача довольно проста; После долгого тестирования был выбран набор значений косинуса для получения наилучших результатов, это наши базовые функции , и визуализированные на изображении ниже.

Что касается проблемы «как они должны быть взвешены вместе», просто (HA!) Примените эту формулу.

Я избавлю вас от того, что означают все эти значения, вы можете найти их на странице википедии.

Основной результат состоит в том, что для блока пикселей 8×8 в каждом цветовом канале применение вышеуказанной формулы и базисных функций сгенерирует новую матрицу 8×8, которая представляет веса, которые будут использоваться во время реконструкции. Вот графическое изображение процесса:

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

На данный момент мы больше не работаем с цветовыми пространствами, а работаем напрямую с матрицей G (базисные веса), все дальнейшее сжатие выполняется непосредственно на этой матрице.

Проблема в том, что теперь мы преобразовали выровненные по байтам целые числа в действительные числа. Что эффективно раздувает нашу информацию (переход от 1 байта к 1 с плавающей точкой (4 байта)). Чтобы решить эту проблему и начать производить более значительное сжатие, мы переходим к фазе квантования.

Квантование

Итак, мы не хотим сжимать данные с плавающей запятой.Это приведет к раздуванию нашего потока и не будет эффективным. С этой целью мы; хотели бы найти способ преобразовать матрицу весов обратно в значения в пространстве [0,255]. Непосредственно мы могли бы сделать это, найдя минимальное / максимальное значение для матрицы (-415,38 и 77,13 соответственно) и разделив каждое число в этом диапазоне, чтобы получить значение между [0,1], на которое мы умножаем на 255. чтобы получить окончательное значение.

Например: [34,12- -415,38] / [77,13 — -415,38] * 255 = 232

Это работает, но компромисс — значительное снижение точности.Это масштабирование приведет к неравномерному распределению значений, что приведет к значительной потере зрения на изображении.

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

В этом примере показана обычно используемая матрица коэффициентов квантования, по одному для каждого базового изображения,

Теперь мы используем матрицы Q и G для вычисления нашей квантованной матрицы коэффициентов DCT:

Например, используя G [0,0 ] = — 415.37 и Q [0,0] = 16 значений:

В результате получается окончательная матрица:

Обратите внимание, насколько упрощается матрица — теперь она содержит большое количество небольших или нулевых элементов, что значительно упрощает компресс.

Вкратце, мы применяем этот процесс к каналам Y, CbCr независимо, и поэтому нам нужны две разные матрицы: одна для Y, а другая для каналов C:

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

Таким образом, квантование является основным источником артефактов JPEG. Поскольку изображения в правом нижнем углу имеют самые большие делители квантования, артефакты JPEG будут иметь тенденцию напоминать комбинации этих изображений. Матрицей коэффициентов квантования можно напрямую управлять, изменяя «уровень качества» JPEG, который масштабирует его значения вверх или вниз (мы рассмотрим это через минуту)

Сжатие

К настоящему времени мы вернулись в мир целочисленных значений и может двигаться дальше, применяя к нашим блокам стадию сжатия без потерь.Однако, глядя на наши преобразованные данные, вы должны заметить кое-что интересное:

По мере того, как вы перемещаетесь от верхнего левого угла к нижнему правому, частота нулей увеличивается. Похоже, это главный подозреваемый в кодировании длин серий. Но порядок строк и столбцов здесь не идеален, так как это будет чередовать эти серии нулей, а не упаковывать их все вместе.

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

Результат нашей матрицы яркости в этом порядке будет:

−26, −3,0, −3, −2, −6,2, −4,1, −3,1,1,5 , 1,2, -1,1, -1,2,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

Когда данные находятся в этом формате, следующие шаги просты: выполнить RLE для последовательности, а затем применить некоторый статистический кодировщик (Huffman / Arithmetic / ANS) к результатам.

И стрела. Теперь ваш блок закодирован в формате JPG.

Понимание параметра качества

Теперь, когда вы понимаете, как на самом деле создаются файлы JPG, стоит пересмотреть концепцию параметра качества , который вы обычно видите при экспорте изображений JPG из Photoshop (или еще чего-то).

Этот параметр, который мы назовем q, представляет собой целое число от 1 до 100. Вы должны рассматривать q как меру качества изображения: более высокие значения q соответствуют изображениям более высокого качества и большим размерам файлов.

Это значение качества используется во время фазы квантования, чтобы соответствующим образом масштабировать коэффициенты квантования. Таким образом, на единицу веса шаг квантования теперь похож на раунд (Gi, k / alpha * Qi, k)

, где в результате параметра качества создается символ alpha .

Когда увеличивается либо альфа, либо Q [x, y] (помните, что большие значения альфа соответствуют меньшим значениям параметра качества q), больше информации теряется, и размер файла уменьшается на .

Таким образом, если вам нужен файл меньшего размера за счет большего количества визуальных артефактов, вы можете установить более низкое значение качества на этапе экспорта.

Обратите внимание на то, что на изображении самого низкого качества мы видим явные признаки стадии блокировки, а также стадии квантования.

Наверное, самое главное, что параметр качества меняется в зависимости от изображения . Поскольку каждое изображение уникально и представляет различные типы визуальных артефактов, значение Q также будет уникальным.

Заключение

Как только вы поймете, как работает алгоритм JPG, станет очевидным несколько вещей:

  1. Правильное определение значения качества для каждого изображения важно для поиска компромисса между визуальным качеством и размером файла.
  2. Поскольку этот процесс основан на блоках, артефакты будут иметь тенденцию возникать в виде блочности или «звона».
  3. Поскольку обработанные блоки не смешиваются друг с другом, JPG обычно игнорирует возможность сжатия больших массивов одинаковых блоков вместе.Формат WebP хорошо справляется с этой проблемой.

И если вы хотите поиграться со всем этим самостоятельно, все это безумие можно свести к файлу ~ 1000 строк.

ЭЙ!

Хотите узнать, как уменьшить размер файлов JPG?

Хотите узнать, как работают файлы PNG или как их уменьшить?

Хотите большего качества сжатия данных? Купи мою книгу!

Как исправить неверную структуру файла JPEG

Этот пост содержит инструкции по устранению ошибки «Недопустимая структура файла JPEG».Он иллюстрирует некоторые простые и легко реализуемые процедуры и объясняет, почему использование программного обеспечения является возможным вариантом.

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

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

Например, после сжатия изображения 640 * 420 пикселей с 16-битным цветом результирующее изображение будет 8-битным со слоями. Кроме того, формат JPEG поддерживает 8-битные изображения в оттенках серого и 24-битные цветные изображения. Он не поддерживает 16-битное изображение, прозрачность или многослойное изображение.

Восстановление файлов JPEG: некоторые возможные исправления

Ниже приведены исправления, которые вы можете применить в зависимости от ваших требований —

  • Преобразование в другой формат файла:
  1. Найдите изображение JPEG, щелкните его правой кнопкой мыши и выберите Сохранить как
  2. В поле «Окно» измените расширение файла на другой формат. Например, конвертируйте расширение файла JPEG (.jpeg или .jpg) в файл Bitmap (.бмп)
  3. Нажмите Сохранить и сохраните изображение в новом формате файла
  • Переименование расширения файла JPEG:

Я бы посоветовал вам скрыть все расширения файлов JPEG, а затем переименовать их. Если расширения не отображаются в папке, измените настройки:

  1. Перейдите на панель управления < Оформление и персонализация и затем выберите Параметры проводника
  2. Выберите Показать скрытые файлы и папку и на вкладке Просмотр снимите флажок скрыть расширения для известных типов файлов и нажмите Применить
  • Проверьте совместимость:

Необходимо убедиться, что конкретное приложение просмотра не имеет проблем с совместимостью.Попробуйте запустить приложение в режиме совместимости, а затем откройте изображения JPEG.

  1. В поле поиска введите Программы
  2. Он отображает список всех программ, щелкните правой кнопкой мыши конкретную программу и выберите Свойства
  3. На вкладке Совместимость выберите Запустить эту программу в режиме совместимости и нажмите ОК

Stellar JPEG Repair — это приложение для восстановления, которое последовательно восстанавливает все ваши поврежденные или поврежденные файлы JPEG.Вы можете восстанавливать файлы JPEG с различных носителей и устранять такие проблемы, как поврежденный заголовок, вирусная атака, неверная структура файла JPEG и т. Д. И т. Д.

Благодаря более быстрому и эффективному механизму сканирования вы исправите файлы JPEG в установленные сроки. Таким образом, вы можете восстановить изображения JPEG с помощью следующих простых и простых шагов:

  1. Установите и запустите Stellar JPEG Repair.
  2. Щелкните вкладку Добавить файлы , чтобы добавить поврежденные или поврежденные файлы для восстановления
  3. В окне отображается список выбранных файлов.Вы можете либо добавить больше файлов, либо удалить любой файл соответственно. Удалите по ремонту
  4. Файлы можно просматривать во время процесса восстановления
  5. Выберите файлы и сохраните их в желаемом месте

Заключение

Эти возможные исправления могут работать, а могут и не работать, но, по крайней мере, вы можете попробовать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *