Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 5.9. Структура заголовка PCX-файла.
typedef struct pcx_header_typ { char manufacturer; // всегда 10 char version; // 0 - версия 2.5 Paintbrush // 2 - версия 2.8 с палитрой // 3 - версия 2.8 без палитры // 5 - версия 3.0 или старше char encoding; // всегда 1 - RLE кодирование char bits_per_pixel; // количество бит на пиксель // для нашего случая – 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-цепочки?» Да, и гениальное решение этого вопроса состоит в том, что такие значения кодируются не одним, а двумя байтами. Например, если требуется поместить в файл значение 200, то сначала нужно записать число 193 (192-1) как количество повторений, а потом — 200. Посмотрим на рисунок 5.8, чтобы увидеть пример декомпрессии. Теперь настало время написать программу, реализующую чтение файл формата PCX. Она получилась весьма неплохой. Листинг 5.10 даст вам возможность убедиться в этом самостоятельно.
|