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

Описание формата PCX

.doc
Скачиваний:
5
Добавлен:
10.07.2015
Размер:
37.38 Кб
Скачать

При разработке программы на IBM PC, использующей графи-

ческие возможности, возникает вопрос о сохранении изображений,

полученных в ходе работы программы. При этом возникают пробле-

мы переносимости этих изображений и сжатия изображений с целью

экономии памяти на внешних носителях. Наиболее популярными

форматами для хранения графических изображений являются : PCX,

GIF, TIFF, PIC.

Формат PCX использует простейший способ сжатия изображе-

ний, позволяющий выполнять быструю перепись изображения из

файла в видеопамять и обратно. Данный формат используется в

графических редакторах, в частности, в PaintBrush в среде

Windows.

Формат PCX

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

Файлы формата РСХ имеют заголовок с фиксированными поля-

ми. Структура заголовка имеет следующий вид :

Type

PCXHeader = record

Manuf: byte; {=10 для редакторов}

Hard: byte; {номер версии}

Encod: byte; {групповое кодирование (=1)}

Bitpx: byte; {бит на точку}

X1: word; {размеры картинки (включит.)}

Y1: word;

X2: word;

Y2: word;

Hres: integer; {горизонтальное разрешение дисп-

лея}

Vres: integer; {вертикальное разрешение дисплея}

Clrma: array[1..48] of byte; {палитра}

Vmode: byte; {игнорируется}

Nplanes: byte; {количество плоскостей}

Bplin: integer; {байт на строку}

Palinfo: integer; {информация о палитре (1=цв.)}

SHres,SVres:integer; {разрешение сканера}

Xtra: array[1..54] of byte; {фильтр}

end;

Поле Manuf указывает программу, с помощью которой был

создан файл с изображением.

Поле Hard определяет версию структуры файла. Рассматрива-

емый пример соответствует пятой версии.

Если значение поля Encod = 1 , то сжатие выполняется.

Поле Bitpx определяет число битов, выделяемых для хране-

ния значения пиксела в одной плоскости цвета.Обычно выделяется

1 бит, для адаптера VGA c 256 цветами может быть выделено 2

бита.

Поля X1, X2, Y1, Y2 определяют размеры изображения.

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

состав изображения.

Поля Hres и Vres определяют горизонтальное и вертикальное

разрешение дисплея, на котором данное изображение было созда-

но.

Поле Clrma определяет значения элементов палитры цвета

для изображения, содержащего до 16 цветов. Если изображение

содержит большее количество цветов, то информация содержится в

конце файла.

Поле Vmode игнорируется.

Поле Nplanes определяет число плоскостей цвета для хране-

ния изображения. Для адаптеров CGA и Gercules используется од-

на плоскость. Для адаптеров EGA и VGA может использоваться до

4-х плоскостей цвета (подробнее в алгоритме сжатия).

Поле Bplin определяет, сколько байтов в файле выделяется

на биты одной плоскости строки изображения файла. Это поле

имеет важное значение при определении размеров буферов для

хранения распакованных строк. Как правило, например, для

Paintbrush, значения поля округляются до границы слова.

Поле Palinfo определяет способ интерпретации значений

элементов палитры. Если значение поля равно 1, то палитра оп-

ределяет цвет, при других значениях она определяет оттенки се-

рого цвета.

Поля Shres и Svres определяют разрешение сканера, если

изображение было получено с помощью этого устройства.

Поле Xtra резервирует 54 байта для последующих версий.

2. Алгоритм сжатия изображения

Для сжатия изображения применяется метод группового коди-

рования, в котором группа повторяющихся байтов заменяется дву-

мя байтами : байтом-повторителем и повторяющимся байтом. В за-

головке файла поле Encod определяет, сжимались ли данные с по-

мощью этого алгоритма или нет.

Биты, образующие значения каждого пиксела строки изобра-

жения, хранятся не вместе, а отдельно в плоскостях цвета.

Пусть, например, значение пиксела в левом верхнем углу изобра-

жения равно 11 (1011 в двоичном коде). Это значение хранится

следующим образом:

плоскость 0 плоскость 1 плоскость 2 плоскость 3

строка 0 1....... 0....... 1....... 1.......

строка 1

Значение следующего в этой строке пиксела, равное 9, хра-

нится следующим образом:

плоскость 0 плоскость 1 плоскость 2 плоскость 3

строка 0 .1...... .0...... .0...... .1......

строка 1

Сжатие выполняется для каждой строки пикселов отдельно.

Перехода через границы строк при сжатии не происходит. Однако

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

Рассмотрим алгоритм сжатия. Начиная с первого байта в

строке, подсчитывается число байтов с одинаковым значением.

Если повторения есть, записывается в строку сжатых значений

байт-повторитель и байт с повторяющимся значением. В байе-пов-

торителе первые два разряда равны единице, что является отли-

чительным его признаком. Младшие шесть разрядов содержат число

повторений. Таким образом, 64 повторяющихся байта могут быть

сжаты в два байта.

Для неповторяющихся байтов поступают следующим образом.

Байты со значением, меньшим шестнадцатеричного С0, пишутся в

строку сжатых изображений без изменения. В противном случае

значение байта пишется с байтом-повторителем, у которого счет-

чик равен единице.

При распаковке сжатого изображения следует использовать

такой алгоритм:

[1] Считать байт В

[2] Если это байт-повторитель

[3] то Счетчик := 6 младших разрядов

[4] Значение := следующий за В байт

[5] иначе Счетчик := 1

[6] Значение := В

3. Кодирование цвета в палитре

Кодирование цвета в палитре зависит от числа элементов

палитры и адаптера, который предполагается использовать для

вывода изображения. Если используется адаптер EGA (или VGA в

режиме эмуляции EGA), то испльзуется палитра из 48 элементов.

Эта палитра хранится в заголовке файла. Данные о палитре хра-

нятся в следующем виде : яркость красного для нулевого элемен-

та палитры, яркость зеленого для нулевого элемента палитры,

яркость голубого для нулевого элемента палитры, яркость

красного для первого элемента палитры и т.д. Каждый байт зна-

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

принимать значения от 0 до 255. BIOS для адаптера EGA при за-

дании значения элемента палитры использует представления цвета

в следующем виде: 00RGBrgb. R и r представляют компоненту

красного цвета, G и g - зеленого, B и b - голубого. Следова-

тельно, компонента красного Rr может принимать значения 00,

01, 10, 11.

Для щестнадцатицветных режимов адаптера VGA, палитра хра-

нится таким же образом. Для преобразования значений палитры в

формат, совместимый с BIOS VGA, необходимо значение каждой

компоненты сдвинуть вправо на два разряда.

Для режима VGA - 256 цветов - используются два способа. В

обоих случаях палитра хранится после самого изображения. При

первом способе используются младшие 6 разрядов каждой компо-

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

со значением, равным 10 (как и в начале заголовка файла). При

втором способе кодирования используются старшие 6 разрядов

компоненты цвета. В этом случае перед палитрой должен стоять

байт, равный 12.