Promised Land #01
31 декабря 2000

Информаторий - описание формата графических файлов PCX.

<b>Информаторий</b> - описание формата графических файлов PCX.
   ╔══════════════════════════════════╗
   ║                                  ║░░
   ║     ИНФОРМАТОРИЙ: PCX-формат     ║░░
   ║                                  ║░░
   ╚══════════════════════════════════╝░░
      ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

  Ни для кого не секрет, что  в  последнее
время появилось множество игр по типу "Вот
пройдешь уровень - смотри картинку!"  Сами
картинки, в основном, берутся с IBM. И это
понятно - там всякими "илотицескими"  фот-
ками разные компакты до отказа забиты;  не
пропадать же добру!
  Я обеими руками ЗА подобные работы, лишь
бы они делались стильно и  качественно.  И
если с первым проблем обычно не возникает,
то о втором этого сказать пока нельзя.
  Прежде всего, речь идет о качестве  кон-
вертации картинок. Здесь есть масса камней
преткновения. В первую очередь - разрешаю-
щая способность  экрана.  Это  ограничение
принято обходить одним из трех способов:
 1) вырезка из картинки некоего  фрагмента
размером 256*192;
 2) пропорциональное сжатие изображения;
 3) обеспечение просмотра всего  изображе-
ния в его нормальных пропорциях, но  через
окошко Спектрумовского экрана, с перемеще-
нием во всех направлениях.
  Примеры каждого способа, я думаю, вы без
труда вспомните сами. А сейчас хотелось бы
поговорить о другом. Для того, чтобы рабо-
тать с графикой, необходимо иметь сведения
о форматах хранения графических  изображе-
ний на IBM, их внутренней структуре. Сего-
дня речь пойдет об одном из самых  извест-
ных форматов - PCX. Его отличает  простота
и универсальность; программой SEA или ана-
логичной можно изображение любого  формата
быстро конвертировать в  PCX,  без  потери
качества.
  Далее приведен текст из  книги  "Форматы
данных" (автор - Гюнтер Борн). С целью со-
кращения материала, изьяты некоторые фраг-
менты, не имеющие отношения к нашим  зада-
чам.

  Формат  PCX  предназначен  для  хранения
растровых  изображений,  которые  строятся
совокупностью отдельных  точек  в  прямоу-
гольной матрице. Каждая точка  изображения
имеет адрес в строке и в столбце матрицы и
называется "пиксел" (Picture's Element).
  При монохромном изображении каждый  пик-
сел соответствует одному биту, т.е. бит со
значением 1 образует в соответствующем ме-
сте экрана светящуюся точку.
  В цветном изображении для одного пиксела
нужно несколько бит,  поэтому  изображение
разлагается  на  отдельные  цветовые  слои
(красный, зеленый,  синий).  В  результате
суммирования  цветовых   слоев   возникает
цветное изображение.
  Кодирование информации о цветном рисунке
зависит от применяемой графической  карты.
Для распространенных адаптеров EGA  и  VGA
цветовые слои хранятся как битовые плоско-
сти (bit planes).
  В файлах PCX  пикселы  запоминаются  по-
строчно,  причем  каждая  строка  пикселов
хранится послойно в  следующей  последова-
тельности: плоскость 0 соответствует сине-
му цвету, плоскость 1 -зеленому, плоскость
3 - красному, плоскость 4 - интенсивности.
  Формат PCX рассчитан на хранение  прямо-
угольного участка изображения,  состоящего
из N строк по X пикселов в строке. Запоми-
нание изображения осуществляется  построч-
но, причем число бит (X)  четно  и  должно
быть кратно 16. Если оригинальный  рисунок
имеет другие размеры, то  в  конце  строки
добавляется несколько точек. По требованию
разработчика формата (фирма ZSOFT),  число
строк в рисунке должно быть  кратно  8.  В
связи с этим,  в  нижнем  участке  рисунка
иногда приходится  вводить  дополнительные
пустые строки.

      Структура заголовка файла PCX.

  Все версии файлов  PCX  имеют  заголовок
одинаковой структуры длиной 128 байт.  Это
справедливо как для полноэкранных  изобра-
жений, так и для небольших рисунков.
  Ниже приведена таблица, описывающая фор-
мат заголовка файла формата PCX.  Смещение
от начала обозначим как N, а длину  поля -
как L.
╔═══╦═══╦════════════════════════════════╗
║ N ║ L ║          Данные                ║
╠═══╬═══╬════════════════════════════════╣
║ 0 ║ 1 ║ Байт идентификации, для файлов ║
║   ║   ║PCX равен #0A.                  ║
║ 1 ║ 1 ║ Версия файла PCX:              ║
║   ║   ║0=v2.5; 2=v2.8 с опис. палитры; ║
║   ║   ║3=v2.8 без опис. палитры; 5=v3.0║
║ 2 ║ 1 ║ Ключ уплотнения данных:        ║
║   ║   ║0 = без уплотнения;             ║
║   ║   ║1 = уплотнение методом RLE.     ║
║ 3 ║ 1 ║ Количество бит на пиксел       ║
║   ║   ║(т.е. количество плоскостей)    ║
║ 4 ║ 8 ║ Координаты углов рисунка       ║
║   ║   ║XMIN, YMIN, XMAX, YMAX          ║
║ 12║ 2 ║ Разрешение по горизонтали, dpi ║
║   ║   ║(dots per inch, точек на дюйм)  ║
║ 14║ 2 ║ Разрешение по вертикали, dpi   ║
║   ║   ║(dots per inch, точек на дюйм)  ║
║ 16║ 48║ Описание палитры, 16х3 байт    ║
║ 64║ 1 ║ Зарезервировано                ║
║ 65║ 1 ║ Число битовых плоскостей, до 4 ║
║ 66║ 2 ║ Число байт на строку изображе- ║
║   ║   ║ния (четное число)              ║
║ 68║ 2 ║ Параметры палитры:             ║
║   ║   ║1 = цвет - ч/б                  ║
║   ║   ║2 = уровни серого               ║
║ 70║ 58║ Пустые (для заполнения до 128) ║
╚═══╩═══╩════════════════════════════════╝
  Первый байт заголовка  используется  для
идентификации файла PCX. Фирма ZSOFT уста-
новила для этого байта значение 10  (#0A),
и другие изготовители, как  правило,  под-
держивают эту традицию.
  Во втором байте  хранится  номер  версии
программы Paintbrush, при помощи  которой,
как подразумевается, был  создан  рисунок.
Начиная с версии 2.8,  существует  возмож-
ность размещать в файлах PCX данные о  па-
литре.  Если  эта  информация  отсутствует
(например, для черно-белого  изображения),
то байт содержит значение #03.  Для  цвет-
ного рисунка данные о палитре запоминаются
со смещением 68  от  начала  заголовка.  В
этом случае 2-й байт хранит  значение  02,
что для версии  2.8  означает  хранение  в
файле данных о палитре. Начиная  с  версии
3.0,  второй  байт  заполняется  значением
#05.
  Третий байт заголовка содержит  информа-
цию о способе  кодировки  данных  в  файле
PCX. Если значение байта  0,  то  дополни-
тельной кодировки не  производилось.  Зна-
чение 1 указывает,  что  данные  уплотнены
методом RLE (Run-Length Encoding).
  Байт со смещением 3  определяет  количе-
ство битов на пиксел и, как  правило,  со-
держит значение 1, т.е.  наличие  цветовых
слоев не учитывается.
  Со смещения 4 в заголовке файла распола-
гается таблица с четырьмя  записями  по  2
байта, в которых определены  размеры  изо-
бражения.  Координаты  левого  верхнего  и
правого нижнего углов фрагмента  изображе-
ния запоминаются  в  следующей  последова-
тельности:
    XMIN, YMIN, XMAX, YMAX.
  По правому и нижнему краю сохраненного в
файле изображения могут находиться  допол-
нительные точки. Наличие координат в заго-
ловке дает возможность выделить среди дан-
ных PCX реальный участок изображения. Кро-
ме того, координаты могут быть использова-
ны для  вывода  рисунка  в  заданном  поле
экрана.
  Разрешение изображения по горизонтали  в
точках на дюйм (в двух байтах со смещением
12) и разрешение по вертикали (в двух бай-
тах со смещением 14) может быть  использо-
вано для уменьшения искажений рисунка  при
отображении на различных устройствах. Зна-
чения разрешения нужно использовать  осто-
рожно, так как в различных версиях PCX они
трактуются по-разному.
  Со смещения 16 зарезервировано поле дли-
ной 48 байт для размещения  палитры.  Если
рисунок цветной, то в данном поле находят-
ся определения отдельных цветов. По анало-
гии с инструментом художника, таблицу  ис-
пользуемых цветов называют палитрой.  Спо-
соб кодировки палитры зависит от использу-
емого графического адаптера. Как  правило,
на описание  одного  цвета  отводится  три
байта, каждый из которых  определяет  долю
красного, зеленого и синего цветов.
  Для воссоздания 256-цветного режима  VGA
в PCX-файлах фирмы ZSOFT, начиная с версии
3.0, расширена палитра. Таблица в заголов-
ке по-прежнему содержит 16х3=48  байт,  но
истинная таблица цветов загружается  256-ю
записями по 3 байта и добавляется к  концу
файла. Если в байте со смещением  2  заго-
ловка файла хранится значение #05, то  по-
следние 769 байт файла нужно  считывать  в
буфер и использовать для построения  пали-
тры.
  Если в первом байте буфера окажется зна-
чение #0C, то начиная со следующего  байта
размещена таблица цветов, в которой запол-
нены 6  старших  разрядов  каждого  байта.
Чтобы определить  палитру,  совместимую  с
BIOS VGA-адаптера, следует  значение  всех
байт таблицы разделить на 4.
  Байт со смещением 64 заголовка файла за-
резервирован для будущих расширений форма-
та PCX.
  В байте со смещением 65 содержится число
Color Planes, т.е. число  битовых  плоско-
стей, приходящихся на точку изображения. В
цветных  рисунках  обычно  используется  4
плоскости (красный, зеленый, синий, интен-
сивность). При монохромном  изображении  в
данный байт заносится значение 1.
  Хранимое в паре байтов со  смещением  66
число означает число байтов,  приходящихся
на строку изображения.  Это  число  должно
быть четным, так  как  данные  изображения
запоминаются как пары байтов; в случае не-
обходимости используются точки,  дополняю-
щие изображение. При  запоминании  цветных
изображений значение пары байтов со смеще-
нием 66 соответствует длине  строки  одной
битовой плоскости.
  Некоторые версии формата PCX  используют
пару байтов со смещением 68  для  дополни-
тельной  интерпретации  значений  цветовой
таблицы. Значение 1 указывает, что  графи-
ческие данные должны интерпретироваться  в
черно-белом  или  цветном   представлении,
значение 2 - что цвет пикселов представля-
ется оттенками серого. Если в данную  пару
байтов внесены другие  значения,  то  поле
следует игнорировать.
  Чтобы получить длину  заголовка,  равную
128 байт, со смещения 70  располагают  еще
58 байт, равных нулю.

      Кодирование графических данных.

  Вслед за заголовком файла PCX располага-
ются графические  данные  самого  рисунка.
  Каждый рисунок считывается  построчно  и
разделяется на битовые плоскости: красный,
зеленый, синий, интенсивность. Затем соот-
ветственно биты первой строки  соединяются
в пары байтов, образуя плоскость  красного
цвета. Незагруженные биты в последней паре
байтов  дополняются  нулями.  После  этого
следует первая строка  плоскости  зеленого
цвета, плоскости синего цвета и строки би-
товой плоскости интенсивности. Процесс по-
вторяется до тех пор, пока не будут введе-
ны все строки изображения.
  В  файлах  PCX  используют  два   метода
укладки графических  данных  в  файл:  без
уплотнения и с  уплотнением.  Если  данные
хранятся без уплотнения, то в  байт  заго-
ловка со  смещением  02  заносится  число,
отличающееся от единицы. Для хранения  не-
уплотненных данных требуется, к сожалению,
значительный  объем  памяти.  Поскольку  в
изображениях существует  много  идентичных
последовательностей пикселов, большой  эф-
фект может дать уплотнение данных. При ис-
пользовании методики уплотнения Run Length
Encoding (RLE) в байт заголовка со  смеще-
нием 02 заносится значение 1.
  Способ кодировки RLE предполагает  выде-
ление последовательности одинаковых  битов
с сохранением количества их  повторений  и
шаблона заполнения. В  файле  кодированные
данные представлены следующим образом:
 >> Если оба старших бита (6,7) байта  за-
полнены единицами, то последующая информа-
ция находится в уплотненной форме. В  этом
случае биты 0-5 указывают необходимое  ко-
личество повторов цепочки битов,  занесен-
ных в следующий байт.
 >> Если оба старших  бита  первого  байта
содержат  нули,  то  данный  байт  следует
трактовать именно как байт данных.
  Уплотнение методом RLE позволяет в  двух
байтах  кодировать  до  63   повторяющихся
байт, или 504 бита. Чтобы различать байты-
маркеры уплотнения RLE,  байты  данных  со
значениями #C0 и  более  нельзя  непосред-
ственно вводить в файл. В этом случае обя-
зательно используется пара байтов.  В  ре-
зультате, кодированные файлы PCX  теорети-
чески могут стать более длинными, чем  при
неуплотненном запоминании графических дан-
ных. Если такая ситуация возникнет,  тогда
данные записываются неуплотненными.
  Содержимое  файла  PCX  можно  легко   и
быстро декодировать в графическое  изобра-
жение. Это одна из главных причин  широкой
популярности формата PCX.



Другие статьи номера:

Приколы - подборка приколов.

Содержание - краткое описание материалов первого номера журнала.

Всякая всячина - описание программ и игр: Sea Quest "Морской Волк", Kool Eggs, Доман ОС, Brujeria, Windword 2.1, Power UP.

Эксперт советует - советы по игре "Черный Ворон".

Адвентюра - прохождение адвентюрной игры Sea Quest.

Немного о себе - Energy Group приветствует вас!

Програмерство - Basic Rulez! Создание карточный игры на Бейсике.

Информаторий - описание формата графических файлов PCX.

Да будет так - Компьютерная новелла по игре LASER SQUAD.

Читальный зал - пару отрывков из новейшей книги Виктора Суворова - "Самоубийство".

Две эротические историии - Мне почти тридцать лет, а моей подруге Юле девятнадцать...

Ярослав Велинский - рассказ "ЭПИДЕМИЯ".


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От заката - О итогах конкурса по игре VIRUS-2.
Лит. Страничка - Головная боль полковника хауэлла или "объвляю заседание открытым" (продолжение).
Анонс - Новая ПЗУ - Technology Rom v1.0.
Преамбула - Вот и вышел в свет 53-й выпуск нашей газеты.
Новости - Новости из Бреста.

В этот день...   5 ноября