Программирование игр для Windows. Советы профессионала


Графический формат PCX - часть 3


  // для нашего случая – 8

int x,y; // координаты верхнего левого угла изображения

int width,height; // размеры изображения

int horz_res;      // количество пикселей по горизонтали

int vert_res;      // количество пикселей по вертикали

char ega_palette[48]; // EGA-палитра. Ее можно игнорировать,

char reserved;         // ничего значимого

char num_color_planes; // количество цветовых плоскостей

                       //в изображении

int bytes_per_line;    // количество байт на одну строку

int palette_type;      // не беспокойтесь об этом

char padding[58];      // ссылка на палитру в конце файла

} pcx_header, *pcx_header_ptr;

 

Последнюю часть PCX-файла также довольно легко обработать:

§          Необходимо установить указатель на конец файла;

§          Передвинуться вверх на 768 байт;

§          Прочитать 768 байт как палитру.

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

§          Если код прочитанного байта принадлежит множеству 192...255, то мы вычитаем из него 192 и используем полученный результат, как количество повторений следующего байта;

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

Если вы достаточно внимательны, то можете спросить: «А как же быть с пикселями, имеющими значения от 192 до 255? Интерпретируются ли они как RLE-цепочки?» Да, и гениальное решение этого вопроса состоит в том, что такие значения кодируются не одним, а двумя байтами.


Начало  Назад  Вперед