Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
68
Добавлен:
02.05.2014
Размер:
359.94 Кб
Скачать

Пакеты вертикального повторения

Некоторые RLE-схемы для повышения эффективности сжатия используют другой тип пакетов. Один из наиболее полезных — это пакет повторения строк развертки, известный как пакет вертикального копирования. Этот пакет не хранит реальных данных строк развертки — он просто указывает на необходимость повторить предыдущую строку. Посмотрим, как работает такой пакет.

Предположим, у нас есть изображение, содержащее строки развертки шириной 640 байтов, и что все пиксели в строке развертки одного цвета. При групповом кодировании такой строки потребуется 10 байтов, если считать, что в одном пакете можно закодировать 128 байтов и что каждый пакет будет иметь размер 2 байта. Предположим также, что первые 100 строк развертки данного изображения будут одинакового цвета. Из этого следует, что общий объем закодированных данных этих строк будет равен 1000 байтам (по 10 байтов на строку развертки при групповом кодировании). Если мы воспользуемся пакетом вертикального повторения, занимающего всего один байт (счетчик группы равен 0), то мы сможем просто закодировать первую строку развертки (10 байтов), а затем записать 99 пакетов вертикального копирования (99 байтов), и объем результирующих данных составит всего 109 байтов.

Если в пакет вертикального копирования поместить количество повторяемых строк развертки, то нам потребуется только один пакет, содержащий значение 99. В результате мы сможем закодировать строку развертки в 10 байтах, еще 99 строк — в 2 байтах пакета вертикального повторения, что в итоге позволит нам закодировать первые 100 строк развертки изображения, содержащие 64000 байтов, всего в 12 байтах.

Схемы одно- и двухбайтовых пакетов вертикального повторения приведены на рис. 9.6.

К сожалению, определения пакетов вертикального повторения программно-зависимы. По крайней мере два общих формата — WordPerfect Graphics Metafile (WPG) и GEM Raster (IMG) — используют пакеты повторения строк развертки для повышения степени сжатия данных. Формат WPG применяет схему с простыми двухбайтовыми пакетами, описанную ранее. Если в первом байте RLE-пакета записан 0, то это пакет вертикального копирования и следующий байт содержит количество повторений предыдущей строки развертки.

Формат IMG применяет более сложную схему. Последовательность байтов 00h 00h FFh, появляющаяся в начале закодированной строки развертки, указывает на пакет вертикального копирования. Байт, следующий за этой последовательностью, содержит счетчик повторений (количество повторений минус единица) предыдущей строки развертки.

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

LZW-сжатие

Схема сжатия Лемпела-Зива-Велча (LZW) является одной из наиболее распространенных в компьютерной графике. Этот метод сжатия данных без потерь применяется в различных форматах файлов изображений, в частности в GIF и TIFF, и включен в стандарт сжатия для модемов V.42bis и PostScript Level 2.

В 1977 году Абрахамом Лемпелом и Джекобом Зивом был создан первый компрессор из широко известного сегодня семейства компрессоров LZ. Алгоритмы сжатия LZ77 широко использовались для сжатия текста, а также стали основой таких архивирующих программ, как compress, zoo, lha, pkzip и arj. Алгоритмы сжатия LZ78 более часто применялись для сжатия двоичных данных, например растровых.

В 1984 году, являясь сотрудником Unisys, Терри Велч модифицировал компрессор LZ78 с учетом применения высокоскоростных дисковых контроллеров. Полученный в результате алгоритм LZW широко используется и сегодня.

Алгоритм LZW позволяет работать с любым типом данных. Он обеспечивает достаточно быстрое сжатие и распаковку данных, не требуя при этом выполнения операции с плавающей запятой. Благодаря тому, что LZW пишет сжатые данные байтами, а не словами, результат может быть идентичен и в системах с порядком байтов "старший в младшем", и в системах с порядком байтов "младший в младшем", хотя необходимо учитывать порядок битов (см. главу 6).

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

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

Декодирование LZW-данных осуществляется в порядке, обратном кодированию. Декомпрессор читает код из потока закодированных данных и, если этого кода еще нет в словаре данных, добавляет его туда. Затем этот код переводится в строку, которую он представляет, и записывается в выходной поток несжатых данных.

LZW имеет преимущество перед большинством компрессоров, базирующихся на словарях: для него не обязательно сохранять словарь для последующего декодирования потока данных. Это позволяет экономить определенное коли­чество пространства при записи данных, закодированных методом LZW. При сжатии текстовых файлов LZW инициализирует первые 256 записей словаря 8-битовыми символами ASCII (значения от 00h до FFh) как фразами. Эти фразы представляют всевозможные однобайтовые значения, которые могут встретиться в потоке данных; из них же строятся и все подстроки. Поскольку и LZW-кодировщик, и LZW-декодер начинают свою работу с инициализации словаря этими значениями, декодеру не нужен оригинальный словарь и он строит в процессе декодирования словарь-дубликат.

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

GIF требует, чтобы каждый входной символ LZW был пиксельным значением. Поскольку GIF позволяет сохранять глубину изображений от 1 до 8 битов, то в нем могут существовать от 2 до 256 входных символов LZW и словарь LZW инициализируется соответствующим образом. Не имеет значения, как были упакованы пиксели в оригинале — LZW будет работать с ними как с последовательностью символов.

Подход, примененный в TIFF, не очень хорошо "работает" с пикселями нечетного размера, поскольку упаковка приводит к последовательностям байтов, не совпадающим с оригинальными последовательностями пикселей, отчего все образцы в пикселях "прячутся". Если границы пикселя совпадают с границами байта (например, два 4-байтовых пикселя в байте или один 16-битовый пиксель в 2 байтах), то метод, примененный в TIFF, достаточно удачен.

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

Соседние файлы в папке Лекции по компьютерной графике