Статья со старой версии сайта. Восстановлена из архива по запросам людей из интернетов. Оказывается, еще кому-то нужна…

Автор: Maniac

1. Разнообразие форматов

1.1 Историческая справка

В настоящее время использование полноцветной качественной графики реалистичных цветов на компьютерах класса ПК выглядит совершенно обыденным. Хотя не так давно это было привилегией издательских систем, которые обычно строились на платформах Macintosh или графических станций Silicon Graphics. Пользователи ПК довольствовались же в крайнем случае графикой с цветом, глубиной максимум 8 бит/пиксел (256 цветов) при довольно слабой разрешающей способности 320Х200 или же 16 цветами при разрешении 640Х480.

Сейчас, с развитием архитектур видеоадаптеров и удешевлением видеопамяти на различных микросхемах, среднестатистическому пользователю вполне доступны системы на платформе ПК, успешно работающие с реалистичными (TrueColor) изображениями глубиной 24 бита/пиксел (более 16 млн. цветов).

1.2 Графические форматы

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

Более того, в последние 5 лет в связи с молниеносным распространением Internet и, в частности, технологий World Wide Web, стала вставать проблема другого рода – разработка форматов изображений достаточно компактных для передачи в сети с минимальными задержками и аппаратно независимых, так как к сети подключены компьютеры самых различных архитектур.

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

Формат Макс. глуб. цвета Макс. число цветов Макс. размер изображения, пиксел Методы сжатия Кодирование нескольких изображений
BMP 24 16’777’216 65535×65535 RLE*
GIF 8 256 65535×65535 LZW +
JPEG 24 16’777’216 65535×65535 JPEG
PCX 24 16’777’216 65535×65535 RLE
PNG 48 281’474’976…
…’710’656
2147483647
x2147483647
Deflation (LZ77)
TIFF 24 16’777’216 всего 4’294’967’295 LZW, RLE и другие* +

Кроме этого следует отметить, что наиболее компактными являются форматы JPEG, GIF, PNG, которые, к тому же, платформенно-независимы. Формат BMP является стандартным форматом Windows, однако большого распространения не получает из-за непомерных размеров файлов, особенно при сохранении графики с глубиной цвета 24 бит/пиксел. Касаемо формата TIFF следует заметить, что он, как и JPEG, GIF, является частично платформенно-независимым, однако слишком объемен для использования в сети и, что еще хуже, слишком сложен для интерпретации. Кроме того любые программные изделия, в том числе и просмотровщики графических файлов, содержащие код для кодирования/декодирования данных по алгоритму LZW должны распространяться по соответствующему лицензионному соглашению компании Unisys Corp., владельца алгоритма, что дополнительно удорожает эти продукты.

Дальнейшее рассмотрение мне хотелось бы обратить к межплатформенным форматам, принятым в Internet в качестве стандарта де-факто: JPEG, GIF, PNG.

1.3 JPEG или GIF

Сразу хочу заметить, что формату PNG (Portable Network Graphic) не будет уделено много внимания, хотя, возможно, он его и заслуживает. Это является следствием того, что формат этот появился не так давно и несмотря на все свои достоинства еще не получил всеобщего признания.

Итак, фактически перед человеком или компанией, которая намерена размещать на своих дисках большое количество изображений и, возможно, предоставлять их для использования в Internet, встает дилемма: что выбрать GIF или JPEG.

Формат GIF, разработанный компанией CompuServe, и изначально предлагавшийся именно как формат для обмена изображениями в сети является форматом с достаточно высокой степенью сжатия изображения. Кроме того, GIF обладает дополнительными возможностями, которые делают его использование в сети привлекательным. Первая – это возможность изменения порядка вывода на экран строк изображения, с заполнением промежутков между ними временной информацией. Визуально это выглядит так, что по мере загрузки из сети (что происходит нередко с катастрофически низкой скоростью) изображение на экране появляется как бы “в низком качестве”, а затем, по мере подгрузки дополнительной информации, восстанавливает пропущенные строки изображения. Таким образом, пользователь еще до окончания процесса загрузки может получить представление о содержимом изображения и прервать загрузку ненужного файла большого размера. Вторая возможность заключается в хранении в одном файле боле чем одного изображения, что делает возможной элементарную покадровую анимацию. Еще одной отличительной особенностью GIF является то, что один из цветов можно объявить “прозрачным”, и тогда при выводе изображения те его части, которые выкрашены этим цветом не будут выводиться на экран и под ними будет виден фон, на который изображение накладывается. Самым же большим недостатком GIF является то, что он может хранить изображение, состоящее максимум из 256 цветов, что в последнее время становиться все менее и менее приемлемым. Вместе с этим, пользователей GIF преследует такая же неприятность, что и в случае с форматом TIFF: GIF также использует LZW-сжатие, а следовательно, каждое изображение может распространяться только при наличии соответствующего лицензионного соглашения.

Формат JPEG является TrueColor-форматом, то есть может хранить изображения с глубиной цвета 24 бит/пиксел. Такой глубины цвета достаточно для практически точного воспроизведения изображений любой сложности. Более глубокое представление цвета (например 32 бит/пиксел) реально оказывается практически неотличимым от данного при просмотре на современных мониторах и при распечатке на большинстве доступных принтеров. Такая глубина цвета может оказаться полезной разве только в издательской деятельности. JPEG в общем обладает более высокой степенью сжатия изображений, нежели GIF (подробнее этот аспект описан в главе “Практики использования JPEG”), но не обладает возможностью хранить несколько изображений в одном файле. Недавно была разработана модификация формата JPEG, получившая название Progressive JPEG, что приблизительно можно перевести на русский язык как “постепенный JPEG”, который предназначен для тех же задач, что и чересстрочное отображение GIF-изображений. Это сделало формат JPEG еще более привлекательным в качестве сетевого стандарта. Однако, и в JPEG присутствуют свои недостатки. В отличие от GIF, который может эффективно сжимать изображения практически любого содержания, JPEG ориентирован прежде всего на реалистичные изображения, то есть изображения фотографической направленности, и качество сжатия значительно ухудшается при обработке изображений с четко очерченными линиями и границами цветов.

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

2. Практика использования JPEG

При использовании графики в Internet для оформления Web-страниц самым ценным ресурсом до сих пор является скорость загрузки страницы с удаленного сервера. Здесь перед разработчиком встает выбор использования чересстрочных GIF-изображений либо очень сильно сжатых JPEG (при условии, что Вы не используете Progressive JPEG – он сочетает эти две черты и однозначно лучше). Этот выбор практически не возможно сделать, основываясь на теоретических доводах, потому что он зависит от содержания изображений. Возможно, чересстрочное изображение уже на первых этапах своего воспроизведения на экране будет распознано и этого будет достаточно, а может быть, что конкретное изображение настолько удачно сожмется в JPEG, что скорость его отображения перекроет даже чересстрочный GIF. Можно, тем не менее, придерживаться следующих рекомендаций:

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

Как уже отмечалось выше, формат JPEG ориентирован на изображения реального мира. В таких изображениях достаточно редки четкие цветовые границы, но преобладают плавные переходы цвета. Вместе с тем такие изображения при сканировании дают следующий эффект: пикселы, расположенные рядом имеют различные оттенки часто едва, а то и совсем не различимые глазом. Если хранить такие пикселы в своих “истинных” цветах, то на каждый из них нужно отводить свое место. Сжатие JPEG построено как раз на таких особенностях. Он обладает возможностью эффективно представлять переходы цвета и близкие по значению оттенки компактно с помощью техники квантования цветов (см. главу “Формат JPEG”). Если же Вы располагаете изображением с обширными областями абсолютно одинакового цвета, то такое изображение лучше хранить в каком-нибудь другом формате, например GIF. Однако, такие изображения практически невозможно получить при сканировании реалистичных картин, например фотографий. JPEG позволяет также варьировать качеством в ущерб степени сжатия или наоборот.

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

Изображение Формат Качество Размер файла
GIF 100 38 Кбайт
JPEG 75 12 Кбайт
JPEG 35 4 Кбайт

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

3. Формат jpeg

За счет чего же достигается настолько высокая степень сжатия и за счет чего мы можем варьировать качество? Самое большое отличие формата JPEG от других состоит в том, что в JPEG используется алгоритм сжатия с потерями информации. И количественно меняя процент потерь мы можем производить вышеописанные преобразования. Алгоритм сжатия без потерь так сохраняет информацию об изображении, что распакованное изображение в точности соответствует оригиналу. При сжатии с потерями приносится в жертву часть информации об изображении, чтобы достичь большего коэффициента сжатия. Распакованное изображение JPEG редко соответствует оригиналу абсолютно точно, но очень часто эти различия столь незначительны, что их едва можно (если вообще можно) обнаружить. Фактически можно и не использовать сжатие с потерями, и тогда можно получить JPEG-файл, который будет при отображении выглядит точно, как и исходное отсканированное изображение.

3.1 Цветовая модель

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

3.1.1 Преобразование RGB в YCbCr

Y = 0.299 R + 0.587 G + 0.114 B
Cb = – 0.1687 R – 0.3313 G + 0.5 B + 128
Cr = 0.5 R – 0.4187 G – 0.0813 B + 128

3.1.2 Преобразование YCbCr e RGB

R = Y + 1.402 (Cr-128)
G = Y – 0.34414 (Cb-128) – 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

3.2 Формат

Строго говоря, JPEG обозначает алгоритм сжатия, а не конкретный формат представления графической информации. На деле любую графическую информацию можно сжать по такому алгоритму. Формат файлов, сжатых по алгоритму JPEG принято называть JFIF (JPEG File Interchange Format). Примером этому является, в частности, формат TIFF/JPEG, известный как TIFF 6.0. Я не ставил целью рассматривать в данном исследовании JPEG “вообще”. Поэтому далее привожу спецификацию формата файла JPEG:

‘FFh’, SOI,
‘FF’, APP0, длина, идентификатор, версия, ед. измерения, ПлотностьX, ПлотностьY, ЭтикеткаX, ЭтикеткаY, (RGB)n
Длина (2 байта) – Полная длина поля APP0, включая длину самого поля “длина” (2байта), но исключая сам маркер APP0.
Идентификатор (5 байт) = ‘4Ah’, ’46h’, ’49h’, ’46h’, ’00h’ – это оканчивающаяся нулем строка “JFIF”. Все байты этой строки должны быть записаны со сброшенным старшим битом.
Версия (2 байта) = ‘0102h’ – здесь наиболее важным является главная цифра версии (здесь: 1). Версия 1.02 используется в настоящее время.
Ед. измерения (1 байт) – единицы измерения для значений плотности.
0: пикселы
1: точек на дюйм
2: точек на сантиметр
ПлотностьX (2 байта) – Горизонтальная плотность пикселов
ПлотностьY (2 байта) – Вертикальная плотность пикселов
ЭтикеткаX (1 байт) – Горизонтальное количество пикселов этикетки
ЭтикеткаY (1 байт) – Вертикальное количество пикселов этикетки
(RGB)n (3*n байт) – 24-битные RGB значения для пикселов этикетки, n = ЭтикеткаX * ЭтикеткаY.
[Возможно: Расширения JFIF поля APP0 – описано ниже ]
‘FFh’, SOFn, длина, параметры рамки
Количество цветовых компонент Nf = 1 или 3
1 компонента C1 = 1 – компонента Y
2 компонента C2 = 2 – компонента Cb
3 компонента C3 = 3 – компонента Cr
‘FFh’, EOI

Расширения JFIF поля APP0:

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

Эти дополнительные поля могут присутствовать только в JPEG версии 1.02 или выше:

‘FFh’, APP0, длина, идентификатор, код_расш, данные_расш
длина (2 байта) описание см. выше
идентификатор (5 байт) =’4Ah’, ’46h’, ’58h’, ’58h’, ’00h’ – “JFXX”. Действуют те же соглашения, что и раньше.
код_расш (1 байт) – код, обозначающий тип расширения. В данной версии определены следующие расширения:
=’10h’ Этикетка закодирована методом JPEG
=’11h’ Этикетка сохранена в 1 байт/пиксел
=’13h’ Этикетка сохранена в 3 бит/пиксел
данные_расш (переменно) – остаток данных расширения зависит от его типа. Далее будет описан формат для каждого предопределенного типа расширения.

Расширение JFIF: Этикетка закодирована методом JPEG.

В этом расширении сразу за заголовком расширения (после байта ’10h’) расположено сжатое изображение этикетки. Формат соответствует самому формату JPEG за исключением вложенных маркеров “JFIF” и “JFXX”. Как и в полноразмерном изображении формат расширения содержит параметры рамки:

‘FFh’, SOFn, длина, параметры рамки
Количество цветовых компонент Nf = 1 или 3
1 компонента C1 = 1 – компонента Y
2 компонента C2 = 2 – компонента Cb
3 компонента C3 = 3 – компонента Cr
‘FFh’, EOI

Расширение JFIF: Этикетка сохранена в 1 байт/пиксел.

Расширение позволяет сохранять изображение и палитру. Формат этого расширения:

ЭтикеткаX (1 байт) Горизонтальное количество пикселов этикетке.
ЭтикеткаY (1 байт) Вертикальное количество пикселов этикетке.
Палитра (768 байт) 24-битные RGB значения каждого из 256 цветов этикетки.
Данные (n байт) байты, обозначающие цветовые коды пикселов этикетки. n = ЭтикеткаX * ЭтикеткаY

Расширение JFIF: Этикетка сохранена в 3 байт/пиксел.

Этот расширение хранит полноцветную этикетку без палитры.

ЭтикеткаX (1 байт) Горизонтальное количество пикселов этикетке.
ЭтикеткаY (1 байт) Вертикальное количество пикселов этикетке.
(RGB)n (3*n байт) – 24-битные RGB значения для пикселов этикетки, n = ЭтикеткаX * ЭтикеткаY.

3.3 Метод сжатия

Процесс сжатия изображения JPEG достаточно сложен и часто для достижения приемлемой производительности требует специальной аппаратуры.

Вначале изображение разбивается на квадратные блоки со стороной размером 8 пиксел. Затем производится сжатие каждого блока отдельно за три шага.

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

3.3.1 Квантование цвета

Реальное положение вещей состоит в том, что на экране компьютера мы практически никогда не видим реально полноцветных изображений. Даже при том, что современные мониторы способны отображать любое (бесконечное?) количество цветов, этого, так или иначе, не позволяет делать видеокарта. Итак, на мониторе воспроизводятся, в зависимости от выбранного видеорежима, цвета лишь наиболее близкие к реальным, но отнюдь не реальные. Действительно, сложно отобразить с помощью, например, 256-цветного видеоадаптера изображение, содержащее оттенки 16 млн. цветов! Этот процесс и называется “квантованием цвета”.

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

4. Программы для работы с jpeg

В настоящее время нет недостатка в программных средствах для отображения и преобразования JPEG-файлов. Я использую универсальную программу для работы с графическими фалами Graphics Converter Gold 1.0 компании Inset Systems Inc.

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


Рисунок 1 Основной экран программы

Все действия программы, связанные с преобразованием форматов выполняются через стандартизованную структуру меню “File”, принятую в системе Windows (здесь и далее приводятся английские названия меню, так как интерфейс программы не русифицирован). То есть для преобразования изображения из одного формата в другой необходимо сначала загрузить исходное изображение с помощью команды “Open” и тогда окно с изображением появиться в основном поле программы. В приведенном примере – это файл STRAW.GIF. Далее, при необходимости преобразовать данный файл в формат, например JPEG, необходимо выбрать команду “Save As”. Возникает стандартное окно диалога с некоторыми дополнительными возможностями, в котором нужно написать имя файла для сохранения.

При сохранении файла в формате JPEG программа позволяет выбрать различные параметры преобразования прямо из этого окна по нажатию кнопки “Options”. В этом случае возникает окно диалога настроек показанное на следующем рисунке.


Рисунок 2 Параметры преобразования в JPEG

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


Рисунок 3 Наглядное изменение яркости

К дополнительным возможностям программы относится также весьма полезная возможность вставки изображения из буфера обмена Windows и сохранения его в различных форматах, а не только в BMP, что существенно экономит место. В частности все экранные формы в этом документе вставлены именно таким образом и сохранены в формате GIF. Это достигается опять-таки стандартным способом Windows, а именно, выбором из меню “Edit” пункта “Paste”. В этом случае в основном поле программы появляется изображение из буфера обмена и с ним можно производить все операции, которые позволяет программа выполнять над изображениями, сохраненными в файлах.

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