IBM:PCX
_______
Music by Shov
ОПИСАНИЕ ФОРМАТА PCX
Перевод с английского языка и формати-
рование выполнены сотрудником Института
прикладной математики АН СССР А.Самото-
хиным
От переводчика
──────────────
Исходный документ был получен мною из
JVDialuge 1st BBS 10.09.1991, переведен на
русский язык и отформатирован. Некоторые
части документа, не относящиеся к техни-
ческой информации при переводе были опуще-
ны. Там, где я считал это необходимым, я
снабдил перевод своими комментариями.
ZSoft Corporation
450 Franklin Rd. Suite 100
Marietta, GA 30067
(404) 428-0008
Copyright 1988 ZSoft Corporation
Введение
Цель создания данного буклета состоит
в том, чтобы помочь пользователям и разра-
ботчикам программ разобраться в техничес-
ких аспектах формата .PCX и использования
утилиты FRIEZE. Все комментарии, вопросы и
предложения по буклету направляйте по ад-
ресу:
ZSoft Corporation
Technical Support Department
ATTN: Technical Reference Manual
450 Franklin Rd. Suite 100
Marietta, GA 30067
Формат файла изображений (.PCX)
Информация данного раздела будет по-
лезна для вас, если вы хотите написать
программу для чтения или записи PCX фай-
лов. Если вы хотите написать программу для
изображений строго определенного формата,
вы должны быть в состоянии создать нечто
такое, что будет работать вдвое быстрее,
чем "Load from..." в PC Paintbrush. Файлы
изображений, которые используются в про-
дуктах семейства PC Paintbrush и FRIEZE (с
расширениями .PCX) начинаются с заголовка
длиной 128 байт. Обычно вы можете игнори-
ровать этот заголовок, если все ваши изоб-
ражения будут иметь одинаковое разрешение.
Если же вы хотите обрабатывать изображения
с различным разрешением и разным количест-
вом цветов, вам следует корректно интерп-
ретировать информацию, находящуюся в дан-
ном заголовке. Оставшаяся часть файла с
изображением состоит из закодированных
графических данных. При кодировании ис-
пользуется простой алгоритм, основанный на
методе длинных серий. Мы оставляем за со-
бой право изменять этот алгоритм с целью
повышения эффективности упаковки данных.
Если в файле запоминается несколько цвето-
вых слоев, каждая строка изображения запо-
минается по цветовым слоям (в общем случае
красному-R, зеленому-G, синему-B и слою
интенсивности-I) по схеме, приведенной ни-
же:
Строка изображения 0:
RRR...
GGG...
BBB...
III...
Строка изображения 1:
RRR...
GGG...
BBB...
III...
(и т.д.)
Замечание переводчика
─────────────────────
Здесь в исходном документе имеет мес-
то явная некорректность. Запоминание по
слоям проводится, как правило, для
16-цветных изображений EGA. В этом случае
сначала запоминается содержимое строки из
нулевого слоя видео памяти, затем из пер-
вого и т.д. Нетрудно заметить, что даже
при стандартной палитре EGA, которая уста-
навливается по умолчанию BIOS'ом, нулевой
слой видео памяти содержит СИНЮЮ компонен-
ту цвета, а не красную. Если же палитра
отлична от стандартной, то говорить о том,
что слои видео памяти соотносятся с компо-
нентами цвета вообще затруднительно.
Метод кодирования состоит в следующем:
ДЛЯ каждого байта X, прочитанного из файла
ЕСЛИ оба старших бита X равны 1, то
<повторитель> = 6 младшим битам X
<данные> = следующему байту за X
ИНАЧЕ
<повторитель> = 1
<данные> = X
Поскольку для насыщения данного алго-
ритма требуется в среднем 25% неповторяю-
щихся данных и по меньшей мере наличие
смещения между повторяющимися данными, то
размер получаемого файла, как правило ока-
зывается приемлемым. Формат заголовка фай-
ла приведен ниже.
Замечание переводчика
─────────────────────
Под насыщением алгоритма авторы доку-
мента по всей видимости понимают ситуацию,
когда размер получаемого файла оказывается
больше, чем объем требуемой видео памяти
для представления записанного изображения.
Нужно отметить, что с этой точки зрения
формат PCX, безусловно, не лучший. В част-
ности, такое насыщение достаточно часто
имеет место для цветных реалистичных изоб-
ражений, особенно, если при их создании
применялись методы полутонирования.
Формат заголовка PCX
Смещен. Обозначение Длина Комментарий
0 Manufacturer 1 Постоянный флаг
10 = ZSoft .PCX
1 Version 1 Информация о
версии:
0 = Версия 2.5
2 = Версия 2.8
с информацией о
палитре
3 = Версия 2.8
без информации
о палитре
5 = Версия 3.0
2 Encoding 1 1 = .PCX коди-
рование длин-
ными сериями
3 Bits per pixel 1 Число бит на
пиксел в слое
4 Window 8 Размеры изобра-
жения (Xmin,
Ymin) - (Xmax,
Ymax)в пикселах
включительно
12 HRes 2 Горизонтальное
разрешение соз-
дающего устрой-
ства
14 VRes 2 Вертикальное
разрешение соз-
дающего устрой-
ства
16 Colormap 48 Набор цветовой
палитры (см.
далее текст)
64 Reserved 1
65 NPlanes 1 Число цветовых
слоев
66 Bytes per Line 2 Число байт на
строку в цвето-
вом слое (для
PCX-файлов все-
гда должно быть
четным)
68 Palette Info 2 Как интерпрети-
ровать палитру:
1 = цветная/
черно-белая,
2 = градации
серого
70 Filler 58 Заполняется ну-
лями до конца
заголовка
Все переменные длины 2 являются целыми.
Замечание переводчика
─────────────────────
Во избежание недоразумений: в поле
Window последовательно располагаются 4 це-
лых числа, которые соответствуют угловым
координатам изображения Xmin, Ymin, Xmax,
Ymax. Как правило, Xmin и Ymin = 0.
Декодирование файлов в формате PCX
Сначала определите размер изображения,
вычислив
[XSIZE = Xmax - Xmin + 1] и
[YSIZE = Ymax - Ymin + 1].
Затем вычислите, сколько байтов требуется
для сохранения одной несжатой строки раз-
вертки изображения: TotalBytes = NPlanes *
BytesPerLine
Отметим, что поскольку всегда используется
целое число байтов, возможно существование
неиспользуемых данных в конце каждой стро-
ки развертки. TotalBytes показывает сколь-
ко памяти должно быть доступно для декоди-
рования каждой строки развертки, включая
неиспользуемую информацию на правом конце
каждой строки.
Теперь вы можете начать декодирование
первой строки развертки - прочитайте пер-
вый байт данных из файла. Если два старших
бита этого байта равны 1, оставшиеся шесть
битов показывают сколько раз следует пов-
торить СЛЕДУЮЩИЙ байт из файла. Если это
не так, то этот байт сам является данными
с повторителем равным 1. Продолжайте деко-
дирование до конца строки, ведя подсчет
количества байтов, переданных в буфер вы-
вода. В конце каждой строки развертки име-
ет место остановка алгоритма кодирования,
но ее не существует при переходе от одного
слоя к другому. Когда строка сформирована
полностью, в конце каждого слоя внутри
строки возможно наличие лишних данных. Для
нахождения этого остатка используйте зна-
чения XSIZE и YSIZE. Если данные являются
многослойными, то BytesPerLine показывает,
где заканчивается каждый слой внутри стро-
ки развертки.
Продолжайте декодирование оставшихся
строк. В файле возможно наличие лишних
строк с округлением на 8 или 16 строк.
Замечание переводчика
─────────────────────
Как следует из приведенного описания,
в конце каждой строки развертки предусмат-
ривается остановка алгоритма кодирования,
т.е предполагается, что каждая строка раз-
вертки кодируется независимо. Однако мое
знакомство с файлами в формате PCX показы-
вает, что это не всегда так (файлы в этом
формате пишет не только ZSoft Corpration
!). Поэтому я бы советовал пользователям
не рассчитывать на то, что такая остановка
обязательно будет иметь место. Конец каж-
дой строки лучше все-таки фиксировать по
заполнении ее буфера. Это, безусловно,
чуть усложнит программу декодирования, но
сделает ее более гибкой. (Кстати говоря,
графический редактор PC Paintbrush прек-
расно понимает PCX файлы, записанные без
остановки алгоритма кодирования в конце
каждой строки, хотя при порождении собс-
твенных файлов такую остановку делает).
Описание информации о палитре
Информация о 16-цветной палитре (EGA/VGA)
Информация о палитре запоминается в
одном из двух различных форматов. В стан-
дартном формате RGB (IBM EGA, IBM VGA)
данные запоминаются в 16 тройках. Каждая
тройка состоит из 3 байтов со значениями
красного (Red), зеленого (Green) и синего
(Blue) цветов. Значения могут находиться в
диапазоне 0-255, и поэтому необходима их
интерпретация в формат используемого обо-
рудования. Например, на IBM EGA существуют
4 возможных уровня RGB для каждого цвета.
Поскольку 256/4 = 64, то ниже приведен
список соответствия цветовых значений и
уровней:
Значение Уровень
0-63 0
64-127 1
128-192 2
193-254 3
Информация о 256-цветной палитре VGA
В настоящее время ZSoft добавил воз-
можность хранения в файле изображения PCX
палитры, превышающей 16 цветов. 256-цвет-
ная палитра форматируется и интерпретиру-
ется точно также, как 16-цветная, естест-
венно, за исключением того, что она длин-
нее. Палитра (число цветов x 3 байта дли-
ны) добавляется в конец PCX файла и ей
предшествует байт с десятичным значением
12. Для определения палитры VGA BIOS вам
достаточно разделить прочитанные значения
цветов на 4.
Для доступа к 256-цветной палитре следует:
1. Прочитать в заголовке поле Version. Ес-
ли оно равно 5, палитра должна быть.
2. Прочитать конец файла и отсчитать назад
769 байт. Найденное вами значение должно
равняться 12, что указывает на присутствие
256-цветной палитры.
Замечание переводчика
─────────────────────
Два замечания по поводу 256-цветной
палитры. Во-первых, между пунктами 1 и 2
приведенной инструкции я добавил бы следу-
ющий: "Прочитать в заголовке поле Bits per
pixel. Если оно равно 8, 256-цветная па-
литра должна быть.". Смысл очевиден.
Во-вторых, в настоящее время довольно ши-
рокое распространение получил пакет прог-
рамм .PCX Programmer's Toolkit фирмы Genus
Microprogramming. В этом пакете (по край-
ней мере в известных мне версиях) принят
способ хранения 256-цветной палитры нес-
колько отличный от того, что был описан
выше. Отличие состоит в том, что палитре
предшествует байт с десятичным значением
10 (вместо 12), а значения цветовых компо-
нент занимают младшие 6 битов в каждом из
байтов цветовой тройки (т.е. изменяются от
0 до 63, как это принято в VGA BIOS).
Информация о цветовой палитре CGA
Для стандартной платы IBM CGA битовый
набор для определения палитры более сло-
жен. Используется только первый байт трой-
ки. Первая тройка содержит только первый
байт с осмысленным значением, который оп-
ределяет цвет фона. Чтобы определить цвет
фона, нужно значение этого байта (беззна-
ковое) разделить на 16. В результате будет
получено значение в диапазоне 0-15, кото-
рое и определяет цвет фона. Вторая тройка
содержит осмысленное значение первого бай-
та, которое определяет значение палитры
для трех оставшихся цветов. PC Paintbrush
поддерживает для этих цветов 8 возможных
палитр CGA, и, поскольку значение байта
может быть от 0 до 255, его следует разде-
лить на 32 (см. схему, приведенную ниже).
Taблица цветов для CGA
Байт #16 в заголовке
Цвет фона определяется 4 старшими битами.
Байт #19 в заголовке
Используются только 3 старших бита, ос-
тальные 5 игнорируются. Первые три бита
обозначаются как C, P, I.
Их интерпретация:
C: разрешение color burst - 0 = color; 1
= monochrome
P: палитра - 0 = желтая; 1 = белая
I: яркость - 0 = малая; 1 = повышенная.
Замечание переводчика
─────────────────────
Как видите, исходный документ умалчи-
вает о том, в каких случаях информацию в
заголовке файла следует трактовать как па-
литру CGA. Не исключено, что ветвление
следует вести по полю Version заголовка.
__________________________________________