From: Alena A. Volkova <root@eco.murmansk.su>
Organization: Ecological Fund of Kirovsk
Привет!
Не помню, в какой группе, то-ли в этой, то ли в relcom.fido.ru.hacker
(но на всякий случай посылаю в обе, чтобы автор вопроса поймал ответ)
был вопрос про структуру РСХ-файла. Вот ответ:
-------------
РСХ имеет заголовок с фиксированными полями, их 18, в
них описывается все хар-ки файла. Но учти, что есть нес-
колько структур алгоритма сжатия. Я пишу только о пятом.
Вот структура на С:
typedef struct pcxheader
{
char manuf; // указ на то, где создан файл, для графредактора =10
char hard; // версия структуры файла
char encod; // определяем использование группового кодиров.
// для сжатия, если=1, то да
char bitpx; // число битов, выделяемых для хранения в одной
// плоскости цвета =1, но VGA 256 цветов - 2
int bx1; // размеры картинки, пикселы на границе тоже входят
int y1; // то же
int x2; // то же
int y2; // то же
int hres; // горизонтальное разрешение дисплея
int vres; // вертикальное разрешение дисплея
char clrma[48]; // палитра, но только если у тебя 16 и менее цветов,
// ежели их больше, то ее хранить в конце файла (от-
// дельный разговор!)
char vmode; // игнорируем!
char nplanes; // кол-во плоскостей цвета, для CGA, Hercules только
// одна, выше - до 4-х, в этом случае значение пиксела
// определяется битами в плоскостях цвета. Биты для
// каждого пиксела храним отдельно
int bplin; // сколько байтов выделено в файле на биты одной плос-
// кости строки
int palinfo; // способ интерпретации значений эл-тов палитры, если 1,
// то цвет, другие - оттенки серого
int shres; // горизонтальное разрешение сканера
int svres; // вертикальное разрешение сканера
char xtra[54]; // резервируем 54 байта для последующих версий
// файла формата РСХ
}
PCXHEADER;
На асме это еще красивее, думаю сам переведешь, если надо.
Это только заголовок. Для сжатия используем метод группового
кодирования, где группа повторяющихся байтов заменяется двумя:
повторителем и повторяющимся. Биты, образующие значения каждого
пиксела строки изображения (элемент палитры, определяющий цвет
пиксела на экране) хранятся отдельно в плоскостях цвета. Сжатие
выполняется для каждой строки пикселов отдельно, перехода через
границы строк не происходит, но через границы плоскостей переход
выполняется. Для неповторяющихся байтов делаем так: байты со зна-
чениями меньше 16-ричного С0 пишем в строку сжатых без изменения,
в противном случае значения байта пишется с байтом повторителем,
у которого счетчик равен 1. Для распаковки схемка (на псевдокоде)
[1] Считать байт В;
[2] Если это байт-повторитель
[3] то Счетчик = 6 младших разрядов;
[4] Значение= Следующий за В байт;
[5] иначе Счетчик = 1
[6] Значение В
У PaintBrush свои причуды (вообще, РСХ его родной формат). Он
округляет число байтов, нужных для хранения одной строки разверт-
ки, до следующей границы слова. От этого у каждой строки может
появиться лишний байт (он не используется). А если число битов в
строке (формула х2-х1+1) при делении на 8 имеет отстаток,то в бу-
фер нужен еще байт. Кроме того, он округляет число сохраненных
строк пикселов до числа, кратного 8, или до границы слова. Здесь
нужна такая формула: у2-у1+1.
Цвет в палитре зависит от числа элементов палитры и от твоего
адаптера.
EGA и 16-цветный VGA, то палитра из 48 элементов. Это в за-
головке файла в таком виде: яркость красного для нулевого элемен-
та палитры, яркость зеленого тоже для нулевого, яркость голубого
для него же, далее по тому же кругу R (Red)G(Green)B(Blue) для 1,
потом 2 и так далее. Каждый байт может иметь значения от 0 до 255.
От 0 до 63 - нулевой уровень, от 64 до 127 - первый и так далее.
BIOS для этих адаптеров использует цвета в таком виде 00RGBrgb,
но у BIOS VGA надо значение каждой компонеты сдвинуть вправо на 2
разряда.
Для VGA 256 можно поступить двояко. Но в любом случае палитра
хранится после самого изображения. 1). Используем младшие 6 раз-
рядов каждой компоненты цвета. Перед палитрой должен стоять байт
со значением, равным 10 (как в заголовке). 2). Тут 6 старших раз-
рядов компоненты цвета, тут должен быть байт, равный 12. О других
адаптерах не пишу, уверена, что у тебя 14" 256 цветов, а не что-
-то более.
Ну а записать в файл изображения на экране, да считать из файла
на экран, думаю сможешь, тут ничего специфического нет.
Это все, будут трудности, пиши.
Удачи!
Sincerely,
Al.Wolf
|