Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Исходники Форум Информер Страны мира
   Графика    >>    pcx_stru
   
 
 PCX - Структура PCX файла  Алена Волкова 08.10.1994

Краткое описание структуры PCX файла (Russian)



2k 
 

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