1. Сигнатура файла PCX (1 байт) - Постоянный флаг 10 - ZSoft .PCX
2. Версия. (1 байт) - (0 - Версия 2.5, 2 - Версия 2.8 с информацией о палитре, 3 - Версия 2.8 без информации о палитре, 5 - Версия 3.0).
3. Кодирование. (1 байт) - (1 - кодирование длинными сериями).
4. Бит/пиксел (1 байт) - Число бит на пиксел в слое.
5. Xmin (2 байт) – угловые координаты изображения.
6. Ymin (2 байт) - угловые координаты изображения.
7. Xmax (2 байт) - угловые координаты изображения.
8. Ymax (2 байт) - угловые координаты изображения.
9. Горизонтальное разрешение создающего устройства (2 байт).
10. Вертикальное разрешение создающего устройства (2 байт).
11. Набор цветовой палитры (48 байт).
12. Не используется (1 байт). Зарезервировано.
13. Число цветовых слоев (1 байт).
14. Число байт на строку в цветовом слое (2 байт).
15. Информация о палитре (2 байт) – (1 = цветная/черно-белая, 2 = градации серого).
16. Не используется (58 байт). Заполняется нулями до конца заголовка.
Набор цветовой палитры.
Информация палитры хранится в одном из четырех форматов. Для режимов CGA, используется только первый и четвертый байт палитры заголовка. Первый байт обозначает цвет заднего фона - разделив его на 16 получим величину от 0 до 15. Четвертый байт обозначает цвет переднего фона. Число палитр CGA равно 8, поэтому разделим на 32 чтобы получить величину в пределах от 0 до 7.
Для режимов EGA, данные хранятся в 16 "тройках". Тройка - это 3-байтовый набор величин красного, зеленого и голубого цветов. Так как каждая величина может находиться в диапазоне от 0 до 255, Вы должны отобразить эти величины в одном из четырех возможных уровней для каждого цвета. Следовательно, 256 разделить на 4 будет 64, поэтому с 0 до 63 = уровень 0, с 64 до 127 = уровень 1, и так далее. Система BIOS адаптера EGA ожидает один байт формата 00RGBrgb для кажого регистра палитры. Четыремя возможными величинами для Bb являются 00, 01, 10 и 11. Когда Вы определили уровень для каждого цвета, скомбинируйте их в байте, совместимом с BIOS (Базовой системой ввода-вывода).
Для 16-цветных режимов VGA, палитра снова хранится в "тройках". Для преобразования в совместимый формат BIOS, сдвиньте каждый байт вправо на два бита. Это преобразование автоматически выполняется функцией pcxGetFilePalette или функцией pcxDecodePalette.
И последний формат поддерживает 256-цветный режим VGA. Так как каждый цвет требует тройку RGB (R (red)- Красный, G (green) - зеленый, B (blue) - голубой), для хранения всей палитры VGA будет необходимо 768 байт. Формат PCX, однако, может поддерживать только 16 цветов как максимум, поэтому палитра не может храниться в заголовке изображения по своему обычному адресу.
Формат 256-цветной палитры претерпел мало изменений с тех пор, когда были впервые созданы 256-цветные режимы. Заголовок PCX был изначально создан для хранения 16 цветов как максимум, и длина его составляет всего 128 байт. Для 256-цветной палитры требуется 768 байт (3 умножить на 256) - очевидно, что надо внести изменение. 256-цветная палитра форматируется и интерпретируется точно также, как 16-цветная, естественно, за исключением того, что она длиннее. Палитра (число цветов x 3 байта длины) добавляется в конец PCX файла и ей предшествует байт с десятичным значением 12. Для определения палитры VGA BIOS вам достаточно разделить прочитанные значения цветов на 4.
Для доступа к 256-цветной палитре следует: Прочитать в заголовке поле Version. Если оно равно 5, палитра должна быть. Или прочитать в заголовке поле число бит на пиксел. Если оно равно 8, 256-цветная палитра должна быть.Прочитать конец файла и отсчитать назад 769 байт. Найденное вами значение должно равняться 12, что указывает на присутствие 256-цветной палитры.
Оставшаяся часть файла с изображением состоит из закодированных графических данных. При кодировании используется простой алгоритм, основанный на методе длинных серий. Если в файле запоминается несколько цветовых слоев, каждая строка изображения запоминается по цветовым слоям (в общем случае красному-R, зеленому-G, синему-B и слою интенсивности-I)
Метод кодирования состоит в следующем:
ДЛЯ каждого байта X, прочитанного из файла
ЕСЛИ оба старших бита X равны 1, то
<повторитель> = 6 младшим битам X
<данные> = следующему байту за X
ИНАЧЕ
<повторитель> = 1
<данные> = X
Поскольку для насыщения данного алгоритма требуется в среднем 25% неповторяющихся данных и по меньшей мере наличие смещения между повторяющимися данными, то размер получаемого файла, как правило оказывается приемлемым.
Дата: 2019-12-10, просмотров: 208.