Московский государственный университет печати

Гасов В.М.
Цыганенко А.М.


         

Методы и средства подготовки электронных изданий

Учебное пособие


Гасов В.М.
Методы и средства подготовки электронных изданий
Начало
Печатный оригинал
Об электронном издании
Оглавление

Введение

1.

Глава 1. Основные компоненты электронных изданий

1.1.

Текстовая информация

1.2.

Полутоновые и цветные иллюстрации

1.3.

Анимационная графика

1.4.

Видеоинформация

1.5.

Аудиоинформация

2.

Глава 2. Технологии гипертекстовых изданий

2.1.

Функции гипертекстовых электронных изданий

2.2.

Принципы построения гипертекстовых изданий

2.3.

Математическая модель гипертекста

2.4.

Гипертекстовые Web-документы

2.5.

Подготовка публикаций в среде Adobe Acrobat

2.6.

Технология Help-файлов

2.7.

Средства доставки электронных изданий

2.8.

Классификация и общие принципы оформления электронных изданий

3.

Глава 3. Цифровое представление текстовой информации

3.1.

Стандарты кодирования символов ASCII, ANSI, КОИ-8 и UNICODE

3.2.

Формат PDF

3.3.

Формат разметки текста RTF

4.

Глава 4. Графические форматы

4.1.

Растровый формат GIF

4.2.

Формат графических файлов PNG

4.3.

Графический формат JPEG

4.4.

Формат TIFF

4.5.

Программные средства преобразования форматов

5.

Глава 5. Представление анимационной, видео- и звуковой информации

5.1.

Семейство форматов MPEG

5.1.1.

Компрессия видеоданных в MPEG

5.1.2.

Формат MPEG-1

5.1.3.

Формат MPEG-2

5.1.4.

Формат MPEG-4

5.1.5.

Формат MPEG-7

5.2.

Звуковые форматы

5.3.

Анимационные файловые форматы FLI, FLC, CEL

6.

Глава 6. Программы просмотра Web-публикаций

6.1.

Доступ к Web-странице в Internet

6.2.

Программа просмотра MS Internet Explorer

6.3.

Программа просмотра Netscape Navigator

7.

Глава 7. Языки разметки гипертекста и программирования скриптов

7.1.

Язык разметки гипертекста НТМL

7.2.

Расширенный язык разметки XML

7.3.

Язык Java

7.4.

Язык JavaScript

7.5.

Язык программирования сценариев PHP

7.6.

Язык Perl

7.7.

Язык моделирования виртуальной реальности VRML

8.

Глава 8. Программирование Web-страниц в языковой среде HTML

8.1.

Структура и форматирование HTML-документа

8.2.

Таблицы

8.3.

Изображения и навигационные карты

8.4.

Формы

8.5.

Фреймы

8.6.

Фреймы и таблицы

8.7.

Объекты

8.8.

Гиперссылки

8.9.

Таблицы стилей

9.

Глава 9. Автоматизация создания Web-публикаций. Программный пакет Macromedia Dreamweaver

9.1.

Назначение и функциональные возможности пакета

9.2.

Структурная схема программного пакета

9.3.

Интерфейс пользователя и принципы его организации

9.4.

Некоторые типовые процедуры пакета Dreamweaver

9.4.1.

Работа с текстом

9.4.2.

Вставка изображений

9.4.3.

Создание карты изображения

9.4.4.

Работа с таблицами

9.4.5.

Создание форм

9.4.6.

Работа с фреймами

9.4.7.

Работа со слоями

9.5.

Использование интерактивных возможностей и анимации

9.6.

Создание Web-сайта

10.

Глава 10. Программный пакет MS FrontPage

10.1.

Функциональные возможности программного пакета

10.2.

Структурная схема пакета

10.3.

Пользовательский интерфейс FrontPage

10.4.

Типовые процедуры работы с пакетом

10.5.

Пример создания Web-страницы

11.

Глава 11. Создание мультимедийных изданий. Программный пакет Macromedia Director

11.1.

Функциональные возможности программной среды

11.2.

Интерфейс пользователя

11.3.

Работа с мультимедийными элементами

11.3.1.

Элементы труппы

11.3.2.

Спрайты

11.3.3.

Изображения

11.3.4.

Текст

11.3.5.

Анимация

11.3.6.

Аудиоинформация

11.3.7.

Создание проекторов

11.3.8.

Цифровая видеоинформация

11.4.

Пример мультимедийного гиперграфического издания

Заключение

Библиографический список

Указатели
695   предметный указатель
434   указатель иллюстраций
45   указатель компаний
Рис. 04.01. Структура файлового формата GIF87a Рис. 04.02. Структура дескриптора логического экрана Рис. 04.03. Структура блока цветовой таблицы Рис. 04.04. Порядок строк Рис. 04.05. Структура блока расширения Рис. 04.06, а. Структура PNG-файлов с цветовой палитрой Рис. 04.06, б. Структура PNG-файлов без цветовой палитры Рис. 04.07. Структура JPEG-преобразований Рис. 04.08. Матрица округления с фактором качества, равным 2 Рис. 04.09. Обобщенная структура TIFF-файла Рис. 04.10. Возможные варианты структуры данных файла TIFF Рис. 04.11. Объединение структур данных в файле TIFF Рис. 04.12. Фрагмент меню «Файл» Рис. 04.13. Диалоговое окно «Сохранить как ...» Рис. 04.14. Диалоговое окно «JPEG Опции» Рис. 04.15. Изображение в формате JPEG (качество - 1, стандарт, объем файла - 43861 байт) Рис. 04.16. Изображение в формате JPEG (качество - 5, стандарт, объем файла - 72550 байт) Рис. 04.17. Изображение в формате JPEG (качество - 10, стандарт, объем файла - 377797 байт) Рис. 04.18. Рабочее окно программы Graphics Converter Gold Рис. 04.19. Диалоговое окно настроек

Для представления графических иллюстраций в электронных изданиях используется ряд графических форматов. В настоящее время широкое применение нашла всемирная глобальная сеть InternetInternet (World Wide Web), в которой основными форматами графических данных являются GIF и JPEG. Начинает активно использоваться и графический формат PNG, призванный заменить формат GIF в Web-публикациях. В электронных изданиях на CD-ROMCD-ROM помимо хорошо сжимающих растровых форматов используются векторные и формоопределенные форматы (использующие концепцию метафайла). Данная глава посвящена наиболее популярным графическим форматам электронных изданий GIF, PNG, TIFF и JPEG.

Файловый растровый формат GIF, растровый форматGIF (Graphics Image Format) был предложен фирмой CompuServe Inc. для протокола передачи цветных изображений в глобальных сетях. С его помощью организуется обмен графическими и содержащими элементы графики файлами. Этот формат используется для хранения нескольких растровых изображений в одном файле и применяется для обмена растровыми данными между платформами и системами.

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

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

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

Поэтому формат GIF, главным достоинством которого является минимальный размер файлов, до сих пор сохраняет свое значение основного графического формата World Wide Web.

Еще одна особенность формата GIF состоит в том, что разработчики изменили порядок следования данных в файле. За счет этого передаваемое изображение рисуется сверху вниз с изменением четкости и детальности. То есть изображение становится четче и детальнее по мере поступления информации из сети. Для этого файл изображения формируется при записи так, чтобы сначала шли все строки пикселов с номерами, кратными восьми (первый проход), затем четырем (второй проход), потом двум, и, наконец, последний проход - все оставшиеся строки с нечетными номерами. Во время приема и декодирования такого файла каждый следующий проход заполняет «пропуски» в предыдущих, постепенно приближая изображение к исходному состоянию.

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

GIF в отличие от многих растровых форматов для хранения использует блоки данных и дополнительную протокольную информацию. Блоки данных содержат подблоки и информационные поля. Каждый подблок данных начинается с однобайтового счетчика, который, принимая значения в диапазоне от 1 до 255, указывает количество байтов данных, следующих за байтом счетчика. Подблоки могут объединяться в непрерывные группы (байт счетчика, байты данных, байт счетчика, байты данных и т.д.). Последовательность из одного или нескольких подблоков данных завершается байтом счетчика, имеющим значение 0.

Формат GIF позволяет хранить растровые данные в пикселах с глубиной цвета от 1 до 8 бит. Изображения записываются с применением цветовой модели RGB и данных палитры. Формат позволяет хранить изображения размером до 64000 пикселов, выбирать 256 цветов в 64-миллионной палитре, обеспечивает быструю распаковку при просмотре, эффективное сжатие и аппаратную независимость. Формат позволяет хранить в одном файле несколько изображений, но эта возможность, как правило, используется при кодировании анимаций.

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

GIF87a предусматривает следующие возможности GIF-файла:

  • Чередование (interlacing). Вначале загружается только «остов» изображения, потом, по мере загрузки, оно детализируется. Это позволяет на медленных линиях не грузить весь графический файл целиком для того, чтобы получить о нем представление.

  • Сжатие (compression) по алгоритму LZW, что обеспечивает наименьший объем файла.

  • Размещение нескольких изображений в одном файле.

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

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

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

  • Управление задержкой перед сменой кадров (задается в 1/100 с или ожидание ввода пользователя).

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

  • Определение прозрачного цвета.

  • Вывод текста.

  • Создание управляющих блоков прикладными программами (application-specific extensions). Внутри GIF-файла можно создать блок, который будет игнорироваться всеми программами, кроме той, для которой он предназначен.

Спецификация GIF87а

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

Основные элементы структуры файла GIF87аGIF87а представлены на рис. 4.1Рис. 04.01. Структура файлового формата GIF87a.

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

Заголовок имеет длину 6 байт и применяется для идентификации файла GIF. Заголовок включает Сигнатуру заголовка (Signature) и Версию формата (Version) GIF.

Поле Signature имеет длину 3 байт и содержит в качестве идентификатора обязательные символы «GIF». Ни один из файлов не будет распознан приложением как файл изображения GIF, если он не начинается с этих трех байтов.

Поле Version также имеет длину 3 байт и указывает версию файла GIF (87a или 89а).

Дескриптор логического экрана (рис. 4.2Рис. 04.02. Структура дескриптора логического экрана) включает данные о ширине и высоте отображаемого экрана в пикселах, информацию об экране и цветовой таблице, индекс цвета фона и коэффициент сжатия пикселов.

Поля Ширина и Высота (1-4 байт) определяют минимальное разрешение экрана, требуемое для воспроизведения изображения. Если устройство отображения не способно поддерживать указанное разрешение, то для правильного воспроизведения изображение следует масштабировать. Значение «pixel» также определяет число цветов в изображении. Диапазон значений 'pixel' составляет от 0 до 7, что соответствует 1-8 бит. Это транслируется в диапазон от 2 (черно-белые изображения) до 256 цветов. Бит 3 в байте 5 зарезервирован для будущих определений и должен быть нулевым.

Глобальная цветовая таблицаГлобальная цветовая таблица. Эта таблица является необязательной и рекомендуется для изображений, где требуется точная передача цветов. На существование этой таблицы указывает поле M в байте 5 дескриптора экрана. Обычно глобальная таблица использутся из-за ограничений, существующих в настоящее время в доступном оборудовании. Флаг M в дескрипторе конкретного изображения обычно равен 0. Если глобальная таблица цветов присутствует, ее определение следует непосредственно за дескриптором экрана. Каждый элемент цветовой таблицы состоит из трех байтов, значения которых описывают соответственно относительную интенсивность красного, зеленого и синего цветов для каждого пиксела изображения. Структура блока цветовой таблицы представлена на рис. 4.3Рис. 04.03. Структура блока цветовой таблицы.

Получаемое значение кода цвета каждого пиксела при высвечивании изображения будет соответствовать ближайшему доступному цвету из цветовой таблицы дисплея. Цветовые компоненты представляют собой значения относительной интенсивности от нулевой (0) до полной (255). Белый цвет может быть представлен как (255, 255, 255), черный как (0,0,0) и желтый как (180, 180,0). При высвечивании на дисплеях, которые поддерживают менее 8 бит на цветовой компонент, используются старшие биты. При создании элементов цветовой таблицы GIF на аппаратуре, поддерживающей менее 8 бит на компонент, значение аппаратного компонента рекомендуется конвертировать в 8-битовый формат с помощью следующего соотношения:

<?xml version="1.0" encoding="UTF-16"?>

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

Данные изображения. За Заголовком, Дескриптором логического экрана и данными Глобальной цветовой таблицы следуют один или несколько разделов данных изображения. Каждое изображение в файле GIF записывается отдельно, со своими Дескриптором изображения и Локальной цветовой таблицей.

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

Локальный дескриптор изображения включает следующие компоненты:

  • идентификатор дескриптора изображения;

  • положение изображения на экране по оси Х;

  • положение изображения на экране по оси Y;

  • ширину изображения в пикселах;

  • высоту изображения в пикселах;

  • информацию об изображении и данных цветовой таблицы.

В разделе информации об изображении определяются флаги, указывающие на присутствие локальной таблицы для поиска цветов и определения последовательности высвечивания пикселов: флаг локальной цветовой таблицы (бит 0), флаг чередования (бит 1), флаг сортировки (бит 2), размер элемента локальной цветовой таблицы (биты 5 - 7). Биты 3 - 4 зарезервированы.

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

Значение флага чередования равно 1, если строки изображения чередуются, и 0 в противном случае. Данные изображения GIF хранятся в виде строк развертки и попиксельно. Строки развертки, из которых состоит изображение, обычно хранятся в определенной последовательности - с первой по последнюю. Формат GIF поддерживает и альтернативный способ хранения строк растровых данных - в порядке чередования.

На рис. 4.4Рис. 04.04. Порядок строк представлен порядок строк, записанных обычным способом и по принципу чередования.

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

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

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

Значение флага сортировки определяет, отсортированы ли элементы в цветовой таблице по степени их важности. Определяется это частотой появления цвета в изображении. Значение 1 указывает на отсортированную цветовую таблицу, значение 0 - на таблицу с неотсортированными цветовыми элементами. Субполе Флаг сортировки имеет корректное значение только в версии GIF89a; в версии 87а оно зарезервировано и всегда установлено в 0.

Значение размер элемента локальной цветовой таблицы указывает количество битов на элемент локальной цветовой таблицы.

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

Каждый подблок данных начинается со счетчика байтов. Значение счетчика может изменяться в диапазоне от 1 до 255, определяя количество байтов данных в этом подблоке. Данные подблока следуют непосредственно за счетчиком байтов. Непрерывная группа подблоков данных завершается байтом с нулевым значением. Этот байт может рассматриваться либо как символ-ограничитель, либо как подблок со значением счетчика, равным 0. В обоих случаях он указывает на то, что данных больше нет.

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

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

Терминатор GIF. Для фиксации процесса окончания файла изображения GIF используется один байт данных, который рассматривается как последний символ файла. Значение этого байта всегда равно 3Bh (шестнадцатеричный код символа «;»). Терминатор (или завершитель) воспринимается декодером GIF как сигнал окончания процесса обработки изображения. Он должен присутствовать в каждом файле GIF.

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

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

Расширенный блок GIF. Для того чтобы обеспечить расширение определения GIF, необходим механизм для определения метода упаковки внутри потока данных GIF. Такое расширение было определено и документировано CompuServe для того, чтобы предусмотреть управляемый способ усовершенствований формата. Расширенный блок GIF пакуется способом, похожим на тот, который использовался для растровых данных, но не сжимается. Основная структура блока приведена на рис. 4.5Рис. 04.05. Структура блока расширения.

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

Формат GIF89a

В дальнейшем стандарт GIF был расширен спецификацией GIF89aGIF89a, которая добавила формату указанные выше функциональные возможности.

Структура файла GIF89a. Файл GIF89a состоит из блоков, расположенных в определенной последовательности. Выделяют блоки трех типов:

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

  2. Блоки изображения: изображение, текст, описание палитры - содержат данные для самого изображения.

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

Общая схема следования этих блоков:

  • Заголовок (идентификатор) - определяет формат файла (GIF87a или GIF89a).

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

  • Описание глобальной палитры (необязательно).

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

  • Признак конца файла.

  • Комментарии и специальные блоки не могут располагаться:

    • до описания глобальной палитры (если оно есть) или до описания логического экрана;

    • между блоком управления и соответствующим ему блоком изображения;

    • после признака конца файла.

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

Резервы экономии в GIF не исчерпываются одной лишь компрессией данных. Одним из главных достоинств этого формата является то, что он позволяет произвольно задавать количество цветов, или размер палитры, используемой в изображении. Другие форматы, как правило, имеют лишь стандартные градации глубины цвета: 2, 16, а потом сразу 256, 215 (режим «high color») и 224 (режим «true color»). GIF же может иметь любое количество цветов от 2 до 256, и если в изображении используется, скажем, 64 цвета (26), то для хранения каждого пиксела будет использовано ровно 6 бит.

Иногда описанная выше редукция палитры обходится вообще без потерь качества, так как исходное изображение уже содержало меньше 256 цветов. Но в современных документах иногда требуется более представительная палитра цветов. В этом случае приходится аппроксимировать исходное изображение цветами усеченной палитры. Обычно используется метод аппроксимации, получивший название диффузия (diffusion или dithering). При этом области, которые в оригинале были залиты однородным цветом, после преобразования заполняются смесью пикселов разных цветов, разбросанных по случайному закону. Как правило, каждый отсутствующий в редуцированной палитре цвет передается пикселами двух самых близких к нему цветов новой палитры. В результате изображение приобретает характерную зернистую, шершавую фактуру. Очень часто диффузия является единственным способом, позволяющим хоть сколько-нибудь адекватно передать исходные цвета с помощью палитры, на которой этих цветов нет.

Нечто подобное используется в телевидении для передачи одного полного кадра за два прохода луча (так называемая «чересстрочная развертка»). Поэтому такие изображения были названы Чересстрочные изображениячересстрочными (interlaced).

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

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

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

Формат PNG, формат растровых изображенийPNG предназначен для хранения и передачи растровых изображений. Он позволяет хранить изображения, битовая глубина которых достигает 16 (в шкале серого цвета) или 48 (в truecolor-изображениях) бит/пиксел, а также 16 бит альфа-данных. Этот формат обеспечивает поэтапное отображение данных, хранение информации о прозрачности, а также осуществляет кодирование текстовой информации. В нем используется метод сжатия данных без потерь.

PNG - новый формат, ориентированный на специалистов в области компьютерной графики. Он разработан как альтернатива формату GIF (Graphics Interchange Format), использование которого разработчиками электронных публикаций и графических изображений сопряжено с предварительной оплатой предстоящей реализации изображений в этом формате (лицензирование). Лицензии должны приобретаться и на распространение программ, которые читают или записывают файлы в формате GIF.

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

PNG и GIF89a обладают общими признаками:

  • Форматы организованы в виде потока данных.

  • Обеспечивается сжатие данных изображения без потерь.

  • Поддерживается хранение индексированных изображений, содержащих до 256 цветов.

  • Обеспечивается поэтапное отображение с чересстрочной разверткой.

  • Поддерживается прозрачность основного цвета.

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

  • Оба формата независимы от аппаратных средств и операционной системы.

Вместе с тем формат PNG наделен более широкими функциональными возможностями по сравнению с форматом GIF, например:

  • Более высокая скорость поэтапного отображения с чересстрочной разверткой.

  • Расширенные возможности хранения пользовательских данных.

  • Хранение truecolor-изображений глубиной до 48 бит/пиксел.

  • Хранение изображений в шкале серого цвета глубиной до 16 бит/пиксел.

  • Полный альфа-канал.

  • Гамма-индикатор.

  • CRC-метод выявления разрушения потока данных.

  • Стандартный инструментарий для реализации программ чтения и записи PNG.

  • Стандартный набор эталонных изображений для тестирования программ чтения PNG.

Вместе с тем формат PNG версии 1.0 пока не обладает:

  • возможностью записи нескольких изображений, как GIF;

  • возможностью хранения анимационных последовательностей.

В отличие от большинства графических форматов PNG разработан специальным комитетом ISO. В его состав вошли специалисты по реализации подобных проектов, в частности знакомые с форматом GIF.

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

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

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

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

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

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

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

Завершающая порция (IEND). Располагаясь последней, эта порция маркирует конец PNG-файла или потока данных.

Порции IHDR, IDAT и IEND должны присутствовать в каждом потоке данных PNG.

Ниже на рис. 4.6 приведена структура PNG-файлов двух основных типов: с цветовой палитрой (аРис. 04.06, а. Структура PNG-файлов с цветовой палитрой) и без нее (бРис. 04.06, б. Структура PNG-файлов без цветовой палитры).

Необязательные порции, называемые вспомогательными, программы чтения PNG-файлов могут игнорировать, а программы записи - не записывать. Следует отметить, однако, что если программа чтения не поддерживает эти порции, то в некоторых случаях визуализация записанных в формате PNG изображений может оказаться некорректной (изображения воспроизводятся темными или, наоборот, светлыми; возможны искажения изображения). Поэтому желательно, чтобы программы, использующие формат PNG, обеспечивали интерпретацию большинства стандартных вспомогательных порций (в частности, порции Image Gamma).

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

В табл. 4.1 перечислены стандартные и специальные порции, определенные в спецификации PNG версии 1.0 и в сопутствующей документации. Порции в этом списке следуют в том порядке, в каком они могут появляться в потоке данных PNG.

Таблица 4.1

Тип порции    Может ли быть несколько    Необязательная или нет    Расположение в файле
IHDR    Нет    Нет   Первая порция
cHRM    Нет    Да    Перед PLTE и IDAT
gAMA Нет Да Перед PLTE и IDAT
sBIT Нет Да Перед PLTE и IDAT
PLTE Нет Да Перед IDAT
bKGD Нет Да После PLTE, перед IDAT
hIST Нет Да После PLTE, перед IDAT
tRNS Нет Да После PLTE, перед IDAT
oFFs Нет Да Перед IDAT
pHYs Нет Да Перед IDAT
sCAL Нет Да Перед IDAT
IDAT Да Нет Одним блоком (без разрывов) с другими IDAT
tIME Нет Да Любое
tEXt Да Да Любое
zTXt Да Да Любое
fRAc Да Да Любое
gIFg Да Да Любое
gIFt Да Да Любое
gIFx Да Да Любое
IEND Нет Нет Последняя порция

Описание файла. Подпись в файле PNG занимает 8 байт и содержит информацию о соответствии файла или потока данных спецификации PNG:

typedef struct _PngSignature

{

BYTE Signature[8];/*Идентификатор (всегда

89504E470DOAlAOAh)*/}PNGSIGNATURE;

Подпись содержит значения 89h 50h 4Eh 47h ODh OAh lAh OAh («PNG\r\n\n»). Эта последовательность выглядит как случайный порядок значений, но имеет важный практический смысл. Первый байт, 89h, представляет собой 8-битовое значение, указывающее на то, что файл содержит двоичные данные. Если по какой-либо причине (например, при пересылке по 7-битовому каналу передачи данных) восьмой бит из файла будет удален, то это значение изменится на 09h, и причина, по которой файл оказался искажен, станет очевидной.

Следующие за ним байты выполняют такие функции:

  • позволяют визуально идентифицировать поток данных PNG (байты 2-4 содержат символы «PNG»);

  • помогают выявить факт пересылки файла по изменению управляющей последовательности новая строка («\r\n» заменяется на «\r», «\n» или «\n\r»);

  • останавливают распечатку потока данных PNG в операционной системе MS-DOS;

  • позволяют выявить проблемы преобразования символов возврата каретки и перевода строки (последовательности новая строка) при пересылке файлов.

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

typedef struct PngChunk

(

DWORD DataLength; /* Размер поля Data в байтах */

DWORD Type; /* Код, идентифицирующий тип порции */

BYTE Data[]; /* Блок данных, хранящийся в этой порции */

DWORD Crc; /* Значение 32-битовой контрольной суммы для полей Type и Data */ } PNGCHUNK;

Значение поля DataLength соответствует количеству байтов, записанных в поле Data. Диапазон значений этого поля - от 0 до (231-1).

Значение поля Type - это 4-байтовый код типа данных, хранящихся в порции. Каждый байт этого поля может содержать ASCII-код прописной или строчной буквы (A-Z, a-z). Например, порция IHDR идентифицируется записанным в поле Type значением 69484452h (IHDR). Однако программы чтения файлов PNG должны трактовать коды типа порции как 32-битовые буквальные значения, а не как символьные строки. Как известно, пользователю удобнее читать коды типа в текстовой форме.

В поле Data хранятся данные порции. Если данных в порции нет, то это поле имеет нулевую длину.

Поле Сrс содержит значение 32-битовой контрольной суммы (CRC-32), вычисленное для полей Type и Data, и используется для проверки достоверности данных порции. В формате PNG применяется алгоритм CRC, определенный стандартами ISO 3309 и ITU-T V.42.

Размер порции зависит от размера хранящихся в ней данных и может изменяться в пределах от 12 (если данных нет) до (231-1) байт (максимально возможный объем данных). Порции всегда выравниваются по границам байтов, поэтому заполнитель не требуется.

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

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

typedef struct _IHDRChunk

{

DWORD Width; /* Ширина изображения в пикселах */

DWORD Height; /* Высота изображения в пикселах */

BYTE BitDepth; /* Количество битов на пиксел или выборку */

BYTE ColorType; /* Индикатор интерпретации цвета */

BYTE Compression; /* Индикатор типа сжатия */

BYTE Filter; /* Индикатор типа фильтра */

BYTE Interlace; /* Тип используемой схемы чередования */ )

IHDRCHUNK;

Поля Width и Height указывают ширину и высоту растрового изображения в пикселах. Каждое из этих полей должно содержать значение в диапазоне от 1 до (231-1).

Поле BitDepth определяет количество битов на пиксел (для индексированных цветных изображений) или на выборку (для изображений в шкале серого цвета и truecolor-изображений). В случае индексированных цветных изображений BitDepth может принимать значения 1, 2, 4 или 8, а в случае изображений в шкале серого цвета - 1, 2, 4, 8 или 16. Для truecolor-изображений (с альфа-данными или без них) и изображений в шкале серого цвета с альфа-данными поддерживаются только два значения - 8 и 16.

Поле ColorType указывает, как интерпретируются данные изображения. Допустимыми значениями являются 0 (в градациях серого), 2 (truecolor), 3 (индексированное цветное), 4 (в градациях серого с альфа-данными) и 6 (truecolor с альфа-данными).

Поле Compression содержит индикатор типа сжатия данных изображения. В настоящее время единственным допустимым значением этого поля является 0, что соответствует методу сжатия Deflate.

В поле Filter хранится индикатор способа фильтрации данных изображения перед сжатием. В настоящее время единственное допустимое значение этого поля - 0 (адаптивные методы фильтрации). Значение этого поля не сообщает о самом факте фильтрации; его может подтвердить только байт типа фильтра в начале каждой строки развертки. Фильтрация данных изображения перед их сжатием не обязательна.

Поле Interlace указывает алгоритм чередования, используемый для хранения данных изображения или, точнее, порядок передачи пиксельных данных. Для этого поля определены два значения: 0 (без чередования) и 1 (чередование по алгоритму Adam7).

Порция палитры. Порция палитры (PLTE) присутствует в потоках данных PNG, содержащих данные индексированных цветных изображений. При наличии палитры значение поля Color порции заголовка равно 3. Потоки данных PNG truecolor-изображений (в этом случае поле Color принимает значение 2 или 6) также могут содержать порцию палитры, которую программы отображения «не truecolor»-изображений будут использовать для квантования данных. В потоке данных PNG может присутствовать только одна порция палитры.

Порция палитры имеет длину от 3 до 768 байт и следующий формат:

typedef struct _PLTEChunkEntry {

BYTE Red; /*Красная составляющая (0 = черный, 255 = максимум)*/

BYTE Green; /*3еленая составляющая (0 = черный, 255 = максимум)*/

BYTE Blue; /*Синяя составляющая (0 = черный, 255 = максимум)*/

} PLTECHUNKENTRY;

PLTECHUNKENTRY PLTEChunk[];

PLTEChunk - это массив, содержащий от 1 до 256 элементов PLTECHUNKENTRY. Каждый такой элемент состоит из трех полей: Red, Green и Blue, в которых хранятся значения красной, зеленой и синей составляющих для данного элемента палитры.

Порция данных изображения. Собственно данные изображения хранятся в порции IDAT, причем, в соответствии со спецификацией PNG, всегда в сжатом виде. Хранение в нескольких последовательных порциях IDAT облегчает буферизацию сжатых данных изображения. В потоке сжатых данных нет границ, поэтому порция IDAT может иметь размер от 0 до (231-1) байт.

Завершающая порция изображения. Последней в потоке данных PNG всегда располагается завершающая порция изображения IEND. Никаких данных она не содержит.

Вспомогательные порции. В формате PNG v1.0 определены 10 вспомогательных порций, которые могут встречаться в потоке данных PNG. Некоторые из них содержат информацию, необходимую для правильной интерпретации данных изображения (например, порцию Image Gamma). Ниже приведено описание формата поля Data для некоторых из этих порций.

Порция Background Color. Порция Background Color задает цвет фона изображения. Следует отметить, что программы чтения файлов PNG часто игнорируют эту порцию и устанавливают цвет фона по своему выбору.

Формат данных порции цвета фона определяется форматом данных изображения (а точнее, значением поля ColorType порции IHDR). В индексированном цветном изображении (ColorType = 3) эта порция содержит 1 байт, который соответствует индексу цвета фона в палитре:

С. 139typedef struct _bKGDChunkEntry

{

BYTE Index; /* Индекс цвета фона в палитре */ } BKGDCHUNKENTRY;

Для данных в градациях серого (как с данными альфа-канала, так и без них; ColorType = 0 или 4) в этой порции хранится 2-байтовое значение, которое задает уровень яркости серого цвета фона:

typedef struct _bKGDChunkEntry

(

WORDValue; /*Значение уровня фона*/}

BKGDCHUNKENTRY;

Для truecolor-изображений (как с данными альфа-канала, так и без них; ColorType = 2 или 6) в порции цвета фона хранятся три 2-байтовых значения, которые задают RGB-цвет фона:

typedef struct _bKGDChunkEntry

{

WORD Red; /* Выборка красной составляющей цвета фона */

WORD Green; /* Выборка зеленой составляющей цвета фона */

WORD Blue; /* Выборка синей составляющей цвета фона */ } BKGDCHUNKENTRY;

Порция Primary Chromaticities and White Point. В порции Primary Chromaticities and White Point (основные цвета и белая точка) хранятся RGB-значения на базе цветового пространства 1931 CIE XYZ. Основные цвета задаются значениями координат х и у, умноженными на 100000.

typedef struct _cHRMChunkEntry

(

DWORD WhitePointX; /* х-значение белой точки */

DWORD WhitePointY; /* у-значение белой точки */

DWORD RedX; /* х-значение красной составляющей */

DWORD RedY; /* у-значение красной составляющей */

DWORD GreenX; /* х-значение зеленой составляющей */

DWORD GreenY; /* у-значение зеленой составляющей */

DWORD BlueX; /* х-значение синей составляющей */

DWORD BlueY; /* у-значение синей составляющей */ } CHRMCHUNKENTRY;

Порция Image Gamma. В порции Image Gamma (показатель гамма) хранится первоначальное значение показателя гамма относительно исходной сцены, умноженное на 100000. Отметим, что авторы PNG настоятельно рекомендуют реализовать эту порцию в декодерах.

typedef struct _gAMAChunkEntry

{

DWORD Gamma; /* Показатель гамма */ } GAMACHUNKENTRY;

Порция Image Histogram. В порции Image Histogram (гисто-грамма изображения) хранятся данные о приблизительной частоте использования каждого цвета палитры. Эта порция содержит массив 2-байтовых элементов, каждый из которых соответствует элементу палитры.

typedef struct _hISTChunkEntry

(

WORD Histogram[]; /* Данные гистограммы */ } HISTCHUNKENTRY;

Сжатие данных. Данные PNG-изображений всегда хранятся в сжатом виде. Для сжатия используется схема прогнозирования пиксельных значений с применением одного из вариантов метода Deflate. Алгоритм Deflate (создан Филом Кацем) используется в утилите архивации файлов pkzip. Этот метод сжатия без потерь обладает высокой скоростью кодирования/декодирования, хорошо документирован и распространяется бесплатно. Он поддерживается большинством платформ и операционных систем.

Deflate представляет собой разновидность метода сжатия LZW (запатентованного в 1981 г.). В Deflate используются скользящее окно переменного размера и сортированные хеш-таблицы, позволяющие идентифицировать комбинации данных и сжимать их по алгоритму Хаффмана. В формате PNG применяется разновидность метода Deflate, в которой сортированные хеш-таблицы не используются, поэтому он не является субъектом патентных притязаний или лицензионных соглашений.

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

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

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

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

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

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

На сегодняшний день JPEG, графический форматJPEG является одной из ярких иллюстраций результатов исследований в области развития технологий сжатия изображений. Аббревиатура JPEG происходит от названия комитета по стандартам Joint Photographic Experts Group (Объединенная группа экспертов по фотографии), входящего в состав Международной организации по стандартизации (ISO). В 1982 г. ISO сформировала группу экспертов по фотографии (PEG), возложив на нее обязанности по проведению исследований в области передачи видеосигналов, неподвижных изображений и текстов по каналам ISDN (интегральная цифровая сеть связи). Перед PEG была поставлена задача разработать набор промышленных стандартов по передаче графических данных и данных изображений с помощью цифровых коммуникационных сетей.

В 1986 г. подгруппой ССIТТ были начаты исследования методов сжатия цветных и полутоновых данных для факсимильной связи. Применяемые при этом методы сжатия цветных данных очень напоминали те, которые исследовались группой JPEG. Поэтому было принято решение объединить ресурсы этих групп для совместной работы над единым стандартом.

В 1987 г. ISO и ССIТТ объединили свои группы в комитет, который должен был провести исследования и выпустить стандарт сжатия данных, который применялся бы обеими организациями. Новый комитет получил название JPEG.

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

Например, формат GIF позволял сохранять только изображения с максимальной глубиной цвета 8 бит/пиксел, т.е. не более 256 цветов. Его алгоритм сжатия (LZW) мало подходил для сканированных изображений.

Форматы TIFF и BMP позволяли хранить данные глубиной 24 бит/пиксел, но их версии, существовавшие до JPEG, позволяли применять только схемы кодирования, которые плохо сжимали этот тип данных изображения (LZW и RLE соответственно).

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

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

Алгоритм обработки данных JPEG

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

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

Процесс сжатия по схеме JPEG включает ряд этапов (см. рис. 4.7Рис. 04.07. Структура JPEG-преобразований).

    Преобразование изображения в оптимальное цветовое пространство.

    Субдискретизация компонентов цветности усреднением групп пикселов.

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

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

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

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

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

В случае применения цветового пространства яркость/цветность, например такого, как YUV или YCbCr, достигается лучшая степень сжатия. Компонент Y представляет собой интенсивность, а U и V - цветность. Эта модель может быть переведена в RGB посредством преобразования без какой-либо коррекции насыщенности. Для полутоновых изображений (в градациях серого) используется только одна составляющая Y.

Преобразование цветовой модели 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.

Обратное преобразование модели YCbCr в модель RGB осуществляется с помощью подобных соотношений:

R = Y + 1,402 (Cr -128);

G = Y - 0,34414 (Cb -128) - 0,71414 (Cr -128);

B = Y + 1,772 (Cb -128).

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

Основная часть визуальной информации, к которой наиболее чувствителен глаз человека, состоит из высокочастотных полутоновых компонентов яркости (Y) цветового пространства YCbCr. Две другие составляющие цветности (Сb и Сr) содержат высокочастотную цветовую информацию, к которой глаз человека менее чувствителен. Следовательно, определенная ее часть может быть отброшена и тем самым уменьшено количество учитываемых пикселов для каналов цветности. Например, в изображении размером 1000 × 1000 пикселов можно использовать яркости всех 1000 × 1000 пикселов, но только 500 × 500 пикселов для каждого компонента цветности. При таком представлении каждый пиксел цветности будет охватывать ту же область, что и блок 2 × 2 пиксела (для яркости). В результате мы сохраним для каждого блока 2 × 2 всего 6 пиксельных значений (4 значения яркости и по одному значению для каждого из двух каналов цветности) вместо того, чтобы использовать 12 значений при обычном описании. Практика показала, что уменьшение объема данных на 50% почти незаметно отражается на качестве большинства изображений.

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

Уменьшение разрешения каналов цветности путем субдискретизации или усреднения групп пикселов осуществляется компрессором JPEG.

Стандарт JPEG предлагает несколько различных вариантов определения коэффициентов дискретизации или относительных размеров каналов субдискретизации. Канал яркости всегда остается с полным разрешением (дискретизация 1:1). Для обоих каналов цветности обычно производится субдискретизация 2 - в горизонтальном направлении и 1:1 или 2:1 - в вертикальном. При этом подразумевается, что цветности пикселов будут охватывать ту же область, что и блок 2 × 1 или 2 × 2 яркости пикселов. Согласно терминологии JPEG, эти процессы называются 2h1v- и 2h2v-дискретизацией соответственно.

Другой общепринятой спецификацией дискретизации 2hlv является 4:2:2, а дискретизации 2h2v - 4:2:0; последняя спецификация связана с телевидением. Дискретизация 2hlv используется достаточно широко, поскольку соответствует стандарту NTSC (Национальный комитет по телевизионным стандартам США), однако при весьма незначительном выигрыше в качестве она обеспечивает меньшую степень сжатия, чем дискретизация 2h2v.

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

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

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

После конвертации графических данных в цветовое пространство типа LAB отбрасывается часть информации о цвете (в зависимости от конкретной реализации алгоритма).

Первоначально в спецификациях формата не была предусмотрена субтрактивная цветовая модель CMYK. Фирма Adobe ввела поддержку функции цветоделения. Однако использование цветовой модели CMYK в JPEG для многих программ проблематично. Более надежным решением считается использование JPEG-сжатия в EPS-файлах (Photoshop).

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

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

При пирамидальной сегментации изображение также делится на сегменты, а каждый из них, в свою очередь, на еще более мелкие сегменты. При этом используются различные уровни разрешения. Моделью такого процесса является сегментированная пирамида изображения JPEG (JPEG Tiled Image Pyramid, JTIP), отражающая процедуру создания пирамидального JPEG-изображения с несколькими уровнями разрешения.

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

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

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

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

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

Таким образом, чем выше уровень компрессии, тем больше данных отбрасывается и тем ниже качество изображения. Используя JPEG, можно получить файл в 1-500 раз меньше, чем ВМР. Формат аппаратно независим, полностью поддерживается на РС и Macintosh.

Дискретное косинусное преобразование. Ключевым компонентом работы алгоритма является дискретное косинусное преобразование. Оно представляет собой разновидность преобразования Фурье и имеет прямое и обратное преобразование. Графическое изображение можно рассматривать как совокупность пространственных волн, причем оси x и y совпадают с шириной и высотой картинки, а по оси z откладывается значение цвета соответствующего пиксела изображения. Дискретное косинусное преобразование позволяет переходить от пространственного представления картинки к ее спектральному представлению и обратно. Воздействуя на спектральное представление картинки, состоящее из «гармоник», т. е. отбрасывая наименее значимые из них, можно балансировать между качеством воспроизведения и степенью сжатия.

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

Формула дискретного косинусного преобразования:

<?xml version="1.0" encoding="UTF-16"?>
<?xml version="1.0" encoding="UTF-16"?>

Формула обратного дискретного косинусного преобразования:

<?xml version="1.0" encoding="UTF-16"?>

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

Реализация дискретного косинусного преобразования. Время, необходимое для вычисления каждого элемента матрицы дискретного косинусного преобразования, зависит от ее размера. Так как используются два вложенных цикла, время вычислений составляет 0 (N × N). Одной из особенностей является то, что практически невозможно выполнить дискретное косинусное преобразование для всего изображения сразу. В качестве решения этой проблемы группа разработчиков JPEG предложила разбивать изображение на блоки размером 8x8 точек.

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

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

При таком подходе формула дискретного косинусного преобразования может быть записана в следующем виде:

ДКП = КП × Точки × К Пт ,

где ДКП - дискретное косинусное преобразование; КП - матрица косинусного преобразования размером N × N, элементы которой определяются по формуле

<?xml version="1.0" encoding="UTF-16"?>

Точки - матрица размером N × N, состоящая из пикселов изображения; Пт - транспонированная матрица КП.

При перемножении матриц «цена» вычисления одного элемента результирующей матрицы составляет N умножений и N сложений, при вычислении матрицы дискретного косинусного преобразования - 2 × N соответственно. По сравнению с 0(N × N) это заметное повышение производительности. Так как дискретное косинусное преобразование является разновидностью преобразования Фурье, то все методы ускорения преобразования Фурье могут быть применены и в данном случае.

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

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

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

Выбор матрицы округления. От выбора матрицы округления зависит баланс между степенью сжатия изображения и его качеством после восстановления. Стандарт JPEG позволяет использовать любую матрицу округления, однако ISO разработала набор матриц округления.

Матрица округления строится при помощи очень простого алгоритма. Для того чтобы определить шаг роста значений в матрице округления, задается одно значение в диапазоне [1, 25], называемое фактором качества. Затем матрица заполняется следующим образом:

for (i = 0; i < N; i++)

for (j = 0; j < N; j++)

Matrix[i][j] = 1 + (1 + i + j) * QualityFactor;

Фактор качества задает интервал между соседними уровнями матрицы округления, расположенными на ее диагоналях. Пример полученной таким образом матрицы округления представлен на рис. 4.8Рис. 04.08. Матрица округления с фактором качества, равным 2.

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

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

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

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

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

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

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

Коэффициенты матрицы дискретного косинусного преобразования обходятся зигзагом. После чего нулевые значения кодируются с использованием алгоритма кодирования повторов (RLE), а потом результат обрабатывается с помощью «кодирования энтропии», т. е. алгоритмов Хаффмана или арифметического кодирования, в зависимости от реализации.

Кодирование энтропии. Результатом работы упрощенной схемы кодирования являются тройки следующего вида:

<КоличествоНулей, КоличествоБитов, Коэффициент>

Здесь:

    КоличествоНулей - количество повторяющихся нулей, предшествующих текущему (ненулевому) элементу матрицы дискретного косинусного преобразования;

    КоличествоБитов - количество битов, следующих далее, кодирующих значение коэффициента;

Коэффициент - значение ненулевого элемента матрицы дискретного косинусного преобразования.

Соответствие между полями КоличествоБитов и Коэффициент приведено в табл. 4.2.

Таблица 4.2

Kоличество битов   Kоэффициент
1 [–1, 1]
2 [–3, –2], [2, 3]
3 [–7, –4], [4, 7]
4 [–15, –8], [8,15]
5 [–31, –16], [16, 31]
6 [–63, –32], [32, 63]
7 [–127, –64], [64, 127]
8 [–255, –128], [128, 255]
9 [–511, –256], [256, 511]
10 [–1023, –512], [512, 1023]

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

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

Формат JFIF

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

На основе JPEG-метода сжатия построены многочисленные форматы, например формат TIFF/JPEG, известный как TIFF 6.0, TIFF, QuickTimeQuickTime и др.

Файлы с графикой в формате JPEG имеют расширение *.jpg.

Формат JPEG является TrueColor-форматом, т. е. может хранить изображения с глубиной цвета 24 бит/пиксел. Такой глубины цвета достаточно для практически точного воспроизведения изображений любой сложности на экране монитора. В случае просмотра цветного изображения на экране монитора с большой глубиной цвета (например, 32 бит/пиксел) оно практически не отличается от изображения с глубиной цвета 24 бит/пиксел. Тот же результат наблюдается и при распечатке изображения на большинстве доступных принтеров. Глубина цвета 32 бит/пиксел, как правило, используется в издательской деятельности.

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

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

Алгоритм JPEG и построенные на его основе форматы предусматривают реализацию функциональной возможности, получившей название этикетка. Фактически это уменьшенная копия изображения. Этикетку можно рассматривать как своего рода аналог предложенного в формате GIF приема чересстрочной развертки изображения. При наличии большого количества файлов JPEG можно выводить их на экран в виде этикеток, что позволяет отобразить их достаточно быстро или в большое количество (списком) и тем самым дать пользователю представление о содержимом каждого файла. Этикетки могут быть закодированы методом JPEG; сохранены в формате 1 байт/пиксел (т.е. в виде полутонового изображения) или представлены в виде полноцветного изображения с 16,7 млн. цветов (24 бит/пиксел).

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

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

Схема JPEG была специально разработана для сжатия цветных и полутоновых многоградационных изображений фотографий, телевизионных заставок, другой сложной графики. Конечный пользователь может «отрегулировать» качество кодировщика JPEG, использовав параметр, который иногда называют установкой качества или Q-фактором. Различные реализации данного метода имеют разные диапазоны Q-фактора, но типичным считается от 1 до 100. При значении фактора, равном 1, создается сжатое изображение самого маленького размера, но плохого качества; при значении фактора, равном 100, можно получить сжатое изображение большего размера, но и лучшего качества. Оптимальное значение Q-фактора зависит от содержимого изображения и, следовательно, подбирается индивидуально. Особым искусством при сжатии JPEG является выбор минимального значения Q-фактора, позволяющего создать изображение приемлемого качества и наиболее близкое к оригиналу.

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

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

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

Растровый формат TIFF, растровый форматTIFF (Tagged Image File Format) был создан для преодоления трудностей, которые возникают при переносе графических файлов с IBM-совместимых ПЭВМ на ПЭВМ Macintosh и обратно.

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

Широкое распространение получила разработанная в апреле 1987 г. модификация формата 4.0, которая могла поддерживать обработку несжатых цветных RGB-изображений. TIFF модификации 5.0 (появившийся в августе 1988 г.) позволял хранить цветные изображения с палитрой и поддерживать алгоритм сжатия LZW. Выпущенный в июне 1992 г. TIFF 6.0 расширил свои функциональные возможности поддержкой цветных изображений моделей СМYK и YCbCr, а также использовал метод сжатия JPEG.

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

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

Организация файла. Файлы TIFF состоят из трех разделов: заголовка файла изображения (Image File Header - IFH), директории файла изображений (Image File Directory - IFD) и растровых данных (Тег). Из них необходимыми являются только IFH и IFD. Следовательно, допускается возможность существования файла TIFF, не содержащего растровых данных. Файл TIFF, содержащий несколько изображений, будет включать столько же директорий файла и разделов растровых данных (по одному для каждого изображения). Структура формата представлена на рис. 4.9Рис. 04.09. Обобщенная структура TIFF-файла.

В структуру TIFF-файла входят:

  1. Заголовок, включающий:

    идентификатор порядка байтов в файле (от старших к младшим или наоборот);

    номер версии;

    указатель на первую директорию IFD.

  2. Директория (IFD) - содержит описание одного изображения:

    счетчик тегов в директории;

    последовательность тегов;

    указатель на следующую директорию IFD.

  3. Тег:

    идентификатор поля;

    тип поля (базовое, информационное, факсимильное и поле запоминания и восстановления документов);

    длина поля;

    смещение в файле к данным.

Начальный заголовок содержит 8 байт. Вся информация и параметры, имеющие отношение к изображению, хранятся в полях признаков. Современные версии TIFF включают 45 таких полей. Однако фактически есть два отдельных поля признака для точного определения размеров изображения, а также поля для определения ПЭВМ, программного обеспечения, даты создания файла и т. д. Несколько полей содержат значения по умолчанию и, следовательно, не требуют уточнения. TIFF снабжен полями, которые позволяют правильно воспроизводить изображения с нестандартной разрешающей способностью

TIFF является сложным форматом, поскольку местоположение каждой директории и ее данных (включая растровые данные) может изменяться. Единственной составной частью файла TIFF, которая имеет постоянное место, является заголовок - он всегда располагается в первых восьми байтах каждого файла TIFF. Все остальные данные файла создаются с использованием информации IFD. Директория файла изображения и связанный с ней растр составляют субфайл TIFF. Ограничений на количество субфайлов в файле TIFF не существует.

Каждая директория файла содержит одну или несколько структур данных, называемых тегами. Каждый тег является 12-байтовой записью, содержащей определенную информацию о растровых данных. Тег может хранить данные любого типа, и спецификация TIFF определяет свыше 70 тегов, которые применяются для представления заданной информации. Теги каждой директории объединяются в непрерывные группы.

Теги, определенные спецификацией TIFF, называются общедоступными и не могут изменяться в большей мере, чем это предусмотрено спецификацией. Теги, определенные пользователем, называются частными и предназначены для применения в пользовательских программах через Developer's Desk фирмы Aldus.

В спецификации TIFF 6.0 термин «тег» заменен термином «поле». Теперь на всю 12-байтовую запись данных указывает термин «поле», а термин «тег» переопределен для указания только на число, идентифицирующее это поле.

На рис. 4.10Рис. 04.10. Возможные варианты структуры данных файла TIFF представлены три возможных варианта внутренней структуры файла TIFF, содержащего несколько изображений. В каждом варианте первым расположен заголовок файла. В первом варианте сразу после заголовка записаны все директории файла, а затем - все растровые данные. Такая структура наиболее эффективна для быстрого чтения данных директории. Во втором варианте после каждой директории файла записаны ее растровые данные. Такая структура наиболее характерна для файлов TIFF, содержащих несколько изображений. В третьем варианте растровые данные хранятся сразу после заголовка, а затем располагаются все директории файла. Такая структура может возникнуть, если растровые данные записываются до того, как формируется информация директории.

Каждая директория файла изображения связывает все растровые данные файла TIFF. Данные директории можно прочесть либо непосредственно из структуры IFD, либо найдя их по смещению, записанному в IFD. С помощью смещения в файле TIFF можно задать одно из трех перечисленных ниже местоположений. Смещение, указанное в последних четырех байтах заголовка, определяет позицию первой директории. Последние четыре байта каждой директории содержат информацию о смещении следующей директории, а последние четыре байта каждого тега - либо информацию о смещении данных, либо сами данные. Величина смещения всегда определяется количеством байтов от начала файла TIFF. Возможные способы объединения структур данных в файле TIFF отображены на рис. 4.11Рис. 04.11. Объединение структур данных в файле TIFF.

Файл TIFF может содержать любое количество изображений (включая нулевое). Каждое изображение рассматривается как отдельный растровый субфайл, данные которого описываются информацией IFD. Каждый субфайл TIFF может быть записан в виде отдельного файла или вместе с другими субфайлами объ-единен в один файл TIFF. Каждый растровый субфайл имеет свою директорию файла изображения и может располагаться в любом месте (после заголовка). Каждому изображению может соответствовать только одна директория.

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

Формат директории файла изображений соответствует следующей структуре:

Typedef struct _TifIfd

{

WORD NumDirEntries; /* Количество тегов в IFD */

WORD TagList[]; /* Массив тегов */

DWORD NextIFDOffset; /* Смещение следующей IFD */

} TIFIFD

Поле NumDirEntries является 2-байтовой величиной, задающей количество тегов в IFD. После этого поля следует серия тегов, причем их количество соответствует значению поля NumDirEntries. Каждая теговая структура имеет размер 12 байт и может быть представлена в виде элемента массива структур типа TIFTAG. Количество тегов в одной IFD не должно превышать 65535. Поле NextIFDOffset содержит информацию о смещении начала следующей директории. Если других IFD нет, то значение этого поля равно 00h.

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

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

Тег формата TIFF имеет следующую структуру:

Typedef struct _TifTag

{

WORD Tagid; /* Идентификатор тега */

WORD Datatype; /* Скалярный тип элементов данных */

DWORD DataCount; /* Количество элементов данных тега */

DWORD DataOffset; /* Смещение элементов данных */

} TIFTAG;

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

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

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

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

Для определения полосы растровых данных в файле TIFF используются три тега: RowsPerStrip, StripOffsets и StripByteCounts.

Тег RowsPerStrip задает количество строк сжатых растровых данных в каждой полосе. Значение по умолчанию тега RowsPerStrip указывает максимально возможный размер изображения TIFF. Для всех полос в субфайлах TIFF применяется однотипная схема сжатия. Все они имеют одинаковые битовый и цветовой коды, пиксельную глубину и т.п. Чтобы определить количество полос в субфайле изображения, отличного от YCbCr, используются теги RowsPerStrip и ImageLenght.

Тег StripOffsets содержит массив смещений (по одному на полосу), которые указывают позицию первого байта каждой полосы в файле TIFF. Первый элемент массива указывает смещение первой полосы, второй - смещение второй полосы и т.д. Если данные изображения разделены на плоскости (PIanarConfiguration = 2), то тег StripOffsets использует двухмерный массив значений - таблицу шириной SampIesPerPixeI. В таком случае сначала записываются все колонки компонента цвета (плоскости) со значением 0, затем все колонки компонента цвета (плоскости) со значением 1 и т.д. Полосы данных изображения, организованные в виде плоскостей, могут записываться в файл TIFF в любом порядке, но обычно записываются либо по плоскостям (RRRRGGGGBBBB), либо по компонентам цвета (RGBRGBRGBRGB). Значения тега StripOffsets всегда рассматриваются как показатели смещения от начала файла.

Тег StripByteCounts описывает массив значений, указывающих размер каждой полосы в байтах. Подобно тегу StripOffsets, он содержит одномерный (в случае порций) или двухмерный (в случае плоскостей) массив значений - по одному на полосу. Каждое значение характеризует количество байтов сжатых растровых данных, записанных в соответствующей полосе.

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

Программы записи TIFF обычно пытаются создавать полосы таким образом, чтобы каждая из них включала в себя одинаковое количество строк. Например, растр из 2200 строк может быть разделен на 22 полосы, каждая из которых будет содержать 100 строк растровых данных. Но такое деление не всегда возможно. Положим, растр состоит из 482 строк. Если его разделить на полосы, содержащие по пять строк, то получим 97 полос, причем 96 из них будут состоять из пяти строк данных, а 97-я - только из двух. В этом случае значение пятого тега RowsPerStrip будет корректным для всех полос, кроме последней. Программе чтения TIFF не обязательно знать количество строк в каждой полосе. Достаточно прочесть последнее значение тега StripByteCounts, чтобы определить количество байтов, которое следует прочесть для формирования последней полосы.

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

Создав таблицу смещений полос, можно значительно упростить произвольный доступ к растровым данным. Если необходимо отобразить, например, последние 100 строк изображения, состоящего из 480 строк, а растровые данные разделены на 48 полос по десять строк в каждой, то программа чтения TIFF может пропустить первые 380 строк и обработать только те полосы, смещения которых записаны в последних десяти элементах массива тега StripOffsets. Если смещение не указано, то для определения начальной позиции последних 100 строк необходимо читать все изображение с его начала.

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

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

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

Многие алгоритмы сжатия, и в частности JPEG, для сжатия данных используют двухмерные фрагменты-блоки, а не одномерные полосы. Хранение сжатых данных в виде фрагментов способствует ускорению дешифровки данных. Концепции разделения данных изображения на фрагменты (сегменты) включены в спецификацию TIFF 6.0.

Если вместо полос применяются фрагменты, то три тега, описывающие полосы (RowsPerStrip, StripByteCounts и StripOffsets), заменяются тегами TileWidth, TileLenght, TileOffsets и TileByteCounts. Их предназначение и способ применения фактически те же, что и у тегов, описывающих полосы. Подобно полосам, все фрагменты могут быть либо несжатыми, либо сжатыми по одной схеме. Изображения TIFF могут быть разделены либо только на полосы, либо только на фрагменты.

Теги TileWidth и TileLenght описывают размер фрагментов данных изображения. Их значения должны быть кратными 16, а все фрагменты субфайла должны иметь один размер. Это очень важно для некоторых программ, особенно в случае применения ориентированной на фрагменты схемы сжатия JPEG. Спецификация TIFF 6.0 рекомендует, чтобы фрагменты были прямоугольной формы и содержали (до сжатия) от 4 до 32 Кбайт данных изображения.

Значения тегов TileWidth и TileLenght могут применяться для определения количества фрагментов субфайлов изображений, отличных от YCbCr:

TilesAcross = (ImageWidth + (TileWidth - 1)) / TileWidth;

TilesDown = (ImageLength + (TileLength - 1)) / TileLength;

TilesInImage = TilesAcross * TilesDown;

Если изображение разделено на плоскости (PIanarConngu-ration = 2), то количество фрагментов можно вычислить следующим образом:

TilesInImage = TilesAcross * TilesDown * SamplesPerPixel;

Тег TileOffsets содержит массив смещений первых байтов каждого фрагмента. Фрагменты записываются в субфайл в произвольном порядке. Каждый фрагмент имеет собственное смещение и не зависит от других фрагментов в субфайле. Смещения в этом теге указываются в направлении слева направо и сверху вниз. Если данные изображения разделены на плоскости, то вначале записываются все смещения для первой плоскости, затем все смещения для второй и т.д. Количество смещений в этом теге равно количеству фрагментов изображения (PIanarConnguration = 1) или количеству фрагментов, умноженному на значение тега SamplesPerPixel (PIanarConnguration = 2). Смещения всегда указываются от начала файла TIFF.

Последний тег - TileByteCounts - содержит данные о количестве байтов в каждом сжатом фрагменте. Количество значений этого тега также равно количеству фрагментов изображения, причем эти значения упорядочены тем же способом, что и значения тега TileOffsets.

Обычно размер фрагмента выбирается таким, чтобы точно разделить изображение. Изображение шириной 6400 и длиной 4800 пикселов можно точно разделить на 150 фрагментов шириной 640 и длиной 320 пикселов. Однако не все изображения имеют размеры, кратные 16. Изображение шириной 2200 и длиной 2850 пикселов нельзя точно разделить на фрагменты, размеры которых будут кратными 16. В этом случае решением может стать выбор рациональных размеров фрагмента и дополнение изображения.

Под рациональными понимаются такие размеры фрагмента, при которых размер изображения будет перекрываться минимально. При указанном выше размере изображения можно применить разбиение на фрагменты шириной 256 и длиной 320 пикселов, т.е. сохранить почти то же соотношение ширины и высоты, что и у исходного изображения. Разбиение на фрагменты таких размеров потребует применения по 104 дополнительных пиксела набивки в каждой строке и 30 дополнительных строк. Размер данных изображения с учетом набивки теперь составит 2304 пиксела в ширину и 2880 пикселов в длину, что позволит точно разделить это изображение на 81 фрагмент размером 256 × 320 пикселов.

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

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

В спецификации TIFF 5.0 перечисленные основные типы изображений были названы классами. Каждый файл TIFF строится из общего класса (Class X) и может модифицироваться дополнительным классом, зависящим от типа хранимого изображения: Class В (двухуровневое), Class G (полутоновое), Class P (палитровое) и Class R (полноцветное RGB).

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

Фактически существует еще один класс TIFF - Class F, предназначенный для хранения факсимильных изображений в данном формате. Этот класс файлов (также известен под именем Everex Fax File Format) был создан фирмой Cygnet Technologies. И несмотря на то что данная фирма перестала существовать, формат TIFF Class F продолжает применяться.

TIFF поддерживает два способа хранения цветовых данных. TIFF-P подобен GIF и использует цветовую палитру (карту) для изображения. Сами данные об изображении хранятся как коды в соответствии с цветовой картой. Этот метод обеспечивает эффективность хранения, но ограничивает палитру 256 цветами. Цветовая карта создает свои элементы из 48-битовой палитры (основная структурная единица TIFF - 2-байтовое слово, следовательно, по 16 цветов предоставлено каждой из цветовых плоскостей аддитивной цветовой модели RGB: красной, зеленой и синей). TIFF-R используется для определения полных RGB-изображений. Элемент растра представляется тремя 8-битовыми RGB-значениями, что обеспечивает более 16 млн. цветов.

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

Сжатие. TIFF считается хорошо сжимающим форматом. Он поддерживает несколько схем сжатия, специальные функции управления изображением и многие другие возможности. Кроме того, он позволяет применять схему сжатия, заключающуюся в добавлении необходимых тегов, определяемых пользователем. Формат TIFF 4.0 поддерживал лишь групповое кодирование (RLE) и CCITT (T.4 и Т.6). Обычно эти схемы применяются только для сжатия 8-битовых цветных и полутоновых, а также однобитовых черно-белых изображений соответственно. В TIFF 5.0 была добавлена схема сжатия LZW, обычно используемая при работе с цветными изображениями, а в TIFF 6.0 - метод JPEG, применяемый для сжатия многоградационных цветных и полутоновых изображений. В TIFF применяется также схема сжатия PackBits RLE, используемая инструментальными средствами Macintosh.

Еще одной особенностью TIFF является спецификация разрешающей способности оборудования, например IBM PC, Macintosh и т.д.

Формат TIFF характеризуется большими объемами получаемых файлов (например, изображение формата A4 в цветовой модели CMYK с разрешением 300 dpi, обычно применяемым для высококачественной печати, имеет объем порядка 40 Мбайт). Поэтому он используется преимущественно при вводе информации со сканеров и в электронных версиях печатных изданий.

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

В качестве примера рассмотрим преобразование в JPEG-файл изображения в программном пакете Adobe PhotoshopAdobe Photoshop. В качестве исходного возьмем изображение в формате TIFF, отсканированное с оригинала. Раскрыв его в среде Adobe Photoshop, сохраним это изображение в формате JPEG. Для этого раскроем меню Файл и выберем команду Сохранить как... (рис. 4.12Рис. 04.12. Фрагмент меню «Файл»).

По активизации этой команды на экране появляется диалоговое окно СохрКак (рис. 4.13Рис. 04.13. Диалоговое окно «Сохранить как ...»), с помощью которого можно вы-брать соответствующую папку (директорию) и присвоить файлу конкретное имя.

В свернутом списковом поле СохрКак выбирается расширение *.JPG, *.JPE.

По нажатии кнопки-пиктограммы Сохранить данного диалогового окна на экране монитора визуализируется новое диалоговое окно JPEG Опции (рис. 4.14Рис. 04.14. Диалоговое окно «JPEG Опции»).

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

Кнопки Опции Формата позволяют изменять алгоритм сжатия изображения: Стандартный, Оптимизированный и Усовершенствованный. В последнем случае дополнительно активизируется поле ввода Развертка (значения 3, 4, 5).

Ниже приведены три варианта идентичного изображения с различными значениями качества (рис. 4.15Рис. 04.15. Изображение в формате JPEG (качество - 1, стандарт, объем файла - 43861 байт), 4.16Рис. 04.16. Изображение в формате JPEG (качество - 5, стандарт, объем файла - 72550 байт), 4.17Рис. 04.17. Изображение в формате JPEG (качество - 10, стандарт, объем файла - 377797 байт)). Исходное изображение представлено в формате TIFF, объем файла 705130 байт. В подрисуночных подписях указаны соответствующий режим сохранения изображения и получаемый объем файлов.

Влияние режима Опции Формата на объем файлов незначительно (для качества 5 получаемые значения объемов файлов: 71080, 71524, 71815).

Существуют и специальные программы для преобразования форматов графических файлов, например Graphics Converter Gold (компании Inset Systems Inc).

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

Все действия программы, связанные с преобразованием форматов, выполняются через стандартизованную структуру меню File, принятую в системе WindowsWindows. Для преобразования изображения из одного формата в другой сначала загружается исходное изображение с помощью команды File/Open, по которой изображение появляется в рабочем окне программы. В приведенном примере визуализируется тестовый файл STRAW.GIF.

Для преобразования данного файла в формат JPEG необходимо выбрать команду Save As.... Визуализируется стандартное диалоговое окно с некоторыми дополнительными возможностями, в котором нужно написать имя файла для сохранения.

При сохранении файла в формате JPEG программа позволяет выбрать различные параметры преобразования прямо из этого окна по нажатии кнопки Options. По этой команде визуализируется диалоговое окно настроек (рис. 4.19Рис. 04.19. Диалоговое окно настроек).

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

© Центр дистанционного образования МГУП