IBM:PCX _______ Music by Shov ОПИСАНИЕ ФОРМАТА PCX Перевод с английского языка и формати- рование выполнены сотрудником Института прикладной математики АН СССР А.Самото- хиным От переводчика ────────────── Исходный документ был получен мною из JVDialuge 1st BBS 10.09.1991, переведен на русский язык и отформатирован. Некоторые части документа, не относящиеся к техни- ческой информации при переводе были опуще- ны. Там, где я считал это необходимым, я снабдил перевод своими комментариями. ZSoft Corporation 450 Franklin Rd. Suite 100 Marietta, GA 30067 (404) 428-0008 Copyright 1988 ZSoft Corporation Введение Цель создания данного буклета состоит в том, чтобы помочь пользователям и разра- ботчикам программ разобраться в техничес- ких аспектах формата .PCX и использования утилиты FRIEZE. Все комментарии, вопросы и предложения по буклету направляйте по ад- ресу: ZSoft Corporation Technical Support Department ATTN: Technical Reference Manual 450 Franklin Rd. Suite 100 Marietta, GA 30067 Формат файла изображений (.PCX) Информация данного раздела будет по- лезна для вас, если вы хотите написать программу для чтения или записи PCX фай- лов. Если вы хотите написать программу для изображений строго определенного формата, вы должны быть в состоянии создать нечто такое, что будет работать вдвое быстрее, чем "Load from..." в PC Paintbrush. Файлы изображений, которые используются в про- дуктах семейства PC Paintbrush и FRIEZE (с расширениями .PCX) начинаются с заголовка длиной 128 байт. Обычно вы можете игнори- ровать этот заголовок, если все ваши изоб- ражения будут иметь одинаковое разрешение. Если же вы хотите обрабатывать изображения с различным разрешением и разным количест- вом цветов, вам следует корректно интерп- ретировать информацию, находящуюся в дан- ном заголовке. Оставшаяся часть файла с изображением состоит из закодированных графических данных. При кодировании ис- пользуется простой алгоритм, основанный на методе длинных серий. Мы оставляем за со- бой право изменять этот алгоритм с целью повышения эффективности упаковки данных. Если в файле запоминается несколько цвето- вых слоев, каждая строка изображения запо- минается по цветовым слоям (в общем случае красному-R, зеленому-G, синему-B и слою интенсивности-I) по схеме, приведенной ни- же: Строка изображения 0: RRR... GGG... BBB... III... Строка изображения 1: RRR... GGG... BBB... III... (и т.д.) Замечание переводчика ───────────────────── Здесь в исходном документе имеет мес- то явная некорректность. Запоминание по слоям проводится, как правило, для 16-цветных изображений EGA. В этом случае сначала запоминается содержимое строки из нулевого слоя видео памяти, затем из пер- вого и т.д. Нетрудно заметить, что даже при стандартной палитре EGA, которая уста- навливается по умолчанию BIOS'ом, нулевой слой видео памяти содержит СИНЮЮ компонен- ту цвета, а не красную. Если же палитра отлична от стандартной, то говорить о том, что слои видео памяти соотносятся с компо- нентами цвета вообще затруднительно. Метод кодирования состоит в следующем: ДЛЯ каждого байта X, прочитанного из файла ЕСЛИ оба старших бита X равны 1, то <повторитель> = 6 младшим битам X <данные> = следующему байту за X ИНАЧЕ <повторитель> = 1 <данные> = X Поскольку для насыщения данного алго- ритма требуется в среднем 25% неповторяю- щихся данных и по меньшей мере наличие смещения между повторяющимися данными, то размер получаемого файла, как правило ока- зывается приемлемым. Формат заголовка фай- ла приведен ниже. Замечание переводчика ───────────────────── Под насыщением алгоритма авторы доку- мента по всей видимости понимают ситуацию, когда размер получаемого файла оказывается больше, чем объем требуемой видео памяти для представления записанного изображения. Нужно отметить, что с этой точки зрения формат PCX, безусловно, не лучший. В част- ности, такое насыщение достаточно часто имеет место для цветных реалистичных изоб- ражений, особенно, если при их создании применялись методы полутонирования. Формат заголовка PCX Смещен. Обозначение Длина Комментарий 0 Manufacturer 1 Постоянный флаг 10 = ZSoft .PCX 1 Version 1 Информация о версии: 0 = Версия 2.5 2 = Версия 2.8 с информацией о палитре 3 = Версия 2.8 без информации о палитре 5 = Версия 3.0 2 Encoding 1 1 = .PCX коди- рование длин- ными сериями 3 Bits per pixel 1 Число бит на пиксел в слое 4 Window 8 Размеры изобра- жения (Xmin, Ymin) - (Xmax, Ymax)в пикселах включительно 12 HRes 2 Горизонтальное разрешение соз- дающего устрой- ства 14 VRes 2 Вертикальное разрешение соз- дающего устрой- ства 16 Colormap 48 Набор цветовой палитры (см. далее текст) 64 Reserved 1 65 NPlanes 1 Число цветовых слоев 66 Bytes per Line 2 Число байт на строку в цвето- вом слое (для PCX-файлов все- гда должно быть четным) 68 Palette Info 2 Как интерпрети- ровать палитру: 1 = цветная/ черно-белая, 2 = градации серого 70 Filler 58 Заполняется ну- лями до конца заголовка Все переменные длины 2 являются целыми. Замечание переводчика ───────────────────── Во избежание недоразумений: в поле Window последовательно располагаются 4 це- лых числа, которые соответствуют угловым координатам изображения Xmin, Ymin, Xmax, Ymax. Как правило, Xmin и Ymin = 0. Декодирование файлов в формате PCX Сначала определите размер изображения, вычислив [XSIZE = Xmax - Xmin + 1] и [YSIZE = Ymax - Ymin + 1]. Затем вычислите, сколько байтов требуется для сохранения одной несжатой строки раз- вертки изображения: TotalBytes = NPlanes * BytesPerLine Отметим, что поскольку всегда используется целое число байтов, возможно существование неиспользуемых данных в конце каждой стро- ки развертки. TotalBytes показывает сколь- ко памяти должно быть доступно для декоди- рования каждой строки развертки, включая неиспользуемую информацию на правом конце каждой строки. Теперь вы можете начать декодирование первой строки развертки - прочитайте пер- вый байт данных из файла. Если два старших бита этого байта равны 1, оставшиеся шесть битов показывают сколько раз следует пов- торить СЛЕДУЮЩИЙ байт из файла. Если это не так, то этот байт сам является данными с повторителем равным 1. Продолжайте деко- дирование до конца строки, ведя подсчет количества байтов, переданных в буфер вы- вода. В конце каждой строки развертки име- ет место остановка алгоритма кодирования, но ее не существует при переходе от одного слоя к другому. Когда строка сформирована полностью, в конце каждого слоя внутри строки возможно наличие лишних данных. Для нахождения этого остатка используйте зна- чения XSIZE и YSIZE. Если данные являются многослойными, то BytesPerLine показывает, где заканчивается каждый слой внутри стро- ки развертки. Продолжайте декодирование оставшихся строк. В файле возможно наличие лишних строк с округлением на 8 или 16 строк. Замечание переводчика ───────────────────── Как следует из приведенного описания, в конце каждой строки развертки предусмат- ривается остановка алгоритма кодирования, т.е предполагается, что каждая строка раз- вертки кодируется независимо. Однако мое знакомство с файлами в формате PCX показы- вает, что это не всегда так (файлы в этом формате пишет не только ZSoft Corpration !). Поэтому я бы советовал пользователям не рассчитывать на то, что такая остановка обязательно будет иметь место. Конец каж- дой строки лучше все-таки фиксировать по заполнении ее буфера. Это, безусловно, чуть усложнит программу декодирования, но сделает ее более гибкой. (Кстати говоря, графический редактор PC Paintbrush прек- расно понимает PCX файлы, записанные без остановки алгоритма кодирования в конце каждой строки, хотя при порождении собс- твенных файлов такую остановку делает). Описание информации о палитре Информация о 16-цветной палитре (EGA/VGA) Информация о палитре запоминается в одном из двух различных форматов. В стан- дартном формате RGB (IBM EGA, IBM VGA) данные запоминаются в 16 тройках. Каждая тройка состоит из 3 байтов со значениями красного (Red), зеленого (Green) и синего (Blue) цветов. Значения могут находиться в диапазоне 0-255, и поэтому необходима их интерпретация в формат используемого обо- рудования. Например, на IBM EGA существуют 4 возможных уровня RGB для каждого цвета. Поскольку 256/4 = 64, то ниже приведен список соответствия цветовых значений и уровней: Значение Уровень 0-63 0 64-127 1 128-192 2 193-254 3 Информация о 256-цветной палитре VGA В настоящее время ZSoft добавил воз- можность хранения в файле изображения PCX палитры, превышающей 16 цветов. 256-цвет- ная палитра форматируется и интерпретиру- ется точно также, как 16-цветная, естест- венно, за исключением того, что она длин- нее. Палитра (число цветов x 3 байта дли- ны) добавляется в конец PCX файла и ей предшествует байт с десятичным значением 12. Для определения палитры VGA BIOS вам достаточно разделить прочитанные значения цветов на 4. Для доступа к 256-цветной палитре следует: 1. Прочитать в заголовке поле Version. Ес- ли оно равно 5, палитра должна быть. 2. Прочитать конец файла и отсчитать назад 769 байт. Найденное вами значение должно равняться 12, что указывает на присутствие 256-цветной палитры. Замечание переводчика ───────────────────── Два замечания по поводу 256-цветной палитры. Во-первых, между пунктами 1 и 2 приведенной инструкции я добавил бы следу- ющий: "Прочитать в заголовке поле Bits per pixel. Если оно равно 8, 256-цветная па- литра должна быть.". Смысл очевиден. Во-вторых, в настоящее время довольно ши- рокое распространение получил пакет прог- рамм .PCX Programmer's Toolkit фирмы Genus Microprogramming. В этом пакете (по край- ней мере в известных мне версиях) принят способ хранения 256-цветной палитры нес- колько отличный от того, что был описан выше. Отличие состоит в том, что палитре предшествует байт с десятичным значением 10 (вместо 12), а значения цветовых компо- нент занимают младшие 6 битов в каждом из байтов цветовой тройки (т.е. изменяются от 0 до 63, как это принято в VGA BIOS). Информация о цветовой палитре CGA Для стандартной платы IBM CGA битовый набор для определения палитры более сло- жен. Используется только первый байт трой- ки. Первая тройка содержит только первый байт с осмысленным значением, который оп- ределяет цвет фона. Чтобы определить цвет фона, нужно значение этого байта (беззна- ковое) разделить на 16. В результате будет получено значение в диапазоне 0-15, кото- рое и определяет цвет фона. Вторая тройка содержит осмысленное значение первого бай- та, которое определяет значение палитры для трех оставшихся цветов. PC Paintbrush поддерживает для этих цветов 8 возможных палитр CGA, и, поскольку значение байта может быть от 0 до 255, его следует разде- лить на 32 (см. схему, приведенную ниже). Taблица цветов для CGA Байт #16 в заголовке Цвет фона определяется 4 старшими битами. Байт #19 в заголовке Используются только 3 старших бита, ос- тальные 5 игнорируются. Первые три бита обозначаются как C, P, I. Их интерпретация: C: разрешение color burst - 0 = color; 1 = monochrome P: палитра - 0 = желтая; 1 = белая I: яркость - 0 = малая; 1 = повышенная. Замечание переводчика ───────────────────── Как видите, исходный документ умалчи- вает о том, в каких случаях информацию в заголовке файла следует трактовать как па- литру CGA. Не исключено, что ветвление следует вести по полю Version заголовка. __________________________________________