Введение

Формат файла изображения PCX, расшифровывающийся как PiCture eXchange, — это формат файла изображения, разработанный ныне не существующей компанией ZSoft Corporation из Мариетты, штат Джорджия, США. Он являлся родным форматом для PC Paintbrush и стал одним из первых широко распространенных стандартов обработки изображений в DOS, хотя впоследствии был вытеснен более совершенными форматами, такими как BMP, JPEG и PNG. Файлы PCX обычно хранят изображения с палитрой, индексированные от 2 или 4 цветов до 16 и 256 цветов, хотя формат был расширен и для записи изображений в истинных цветах (24 бита).

Форматы изображений PCX

PCX был разработан на ранних этапах развития аппаратного обеспечения для ПК-дисплеев, и большинство форматов, которые он поддерживал, больше не используются. В таблице ниже представлен список наиболее часто используемых форматов PCX. Современные программы для редактирования изображений могут не поддерживать чтение файлов PCX, соответствующих устаревшему оборудованию. + Распространенные форматы изображений PCX Разрядность Плоскости Количество цветов 4 1 16 цветов из палитры 8 1 256 цветов из палитры 8 1 256 оттенков серого 4 4 4096 цветов с 16 уровнями прозрачности 8 3 16,7 миллиона, 24-битный "истинный цвет" 8 4 16,7 миллиона с 256 уровнями прозрачности 1 1 2 цвета, монохромный (1 бит) (Win 3.1 Paintbrush) 1 4 16 цветов RGBi (4 бита) в 4 плоскостях (Win 3.1 Paintbrush) PCX поддерживается распространенным программным обеспечением для обработки изображений, включая ACDSee, FastStone, GIMP, ImageMagick, IrfanView, LView, Netpbm, PaintShop Pro, Photoshop, Visio, PMview, XnView и GraphicConverter. В версии 2.1.4 FFmpeg мог кодировать и декодировать пиксельные форматы PCX rgb24, rgb8, bgr8, rgb4 byte, bgr4 byte, gray, pal8 и monob. Существует многостраничная версия PCX, используемая некоторыми компьютерными программами для работы с факсами и документами, с расширением файла dcx. Файл DCX состоит из заголовка, представляющего набор последующих файлов PCX.

Макет данных изображения

Данные изображения PCX хранятся в строках или линиях сканирования сверху вниз. Если изображение состоит из нескольких плоскостей, они хранятся последовательно по плоскостям в каждой строке: сначала все данные красного цвета для строки 0, затем все данные зеленого цвета для строки 0, затем синего и, наконец, альфа-канала. Этот шаблон повторяется для каждой строки, как показано в следующей таблице:

+ Данные изображения PCX, организованные по цветовым плоскостям
Строка 0 R R R R R R R R R G G G G G G G G G B B B B B B B B B A A A A A A A A A
Строка 1 R R R R R R R R R G G G G G G G G G B B B B B B B B B A A A A A A A A A
Строка 2 и т.д.

Если глубина цвета изображения меньше 8 бит на пиксель, каждая строка дополняется до следующей четной границы байта. Например, если изображение имеет 1 плоскость данных размером 1 бит (монохромное) и шириной 22 пикселя, каждая строка будет иметь длину 4 байта, то есть 32 бита в строке, из которых 10 бит не используются.

Сжатие данных изображения

Данные изображения PCX сжимаются с помощью кодирования длины серии (RLE) – простого алгоритма сжатия без потерь, который объединяет последовательность из трех и более одинаковых байтов в пару из двух байтов. Два старших бита байта используются для определения, представляют ли данные отдельный пиксель с заданным индексом палитры или цветовым значением, или пару RLE, представляющую серию пикселей с одним и тем же значением: если оба бита установлены в 1, байт интерпретируется как длина серии. Это оставляет 6 бит для фактического значения длины серии, в диапазоне от 0 до 63. В любом другом случае байт интерпретируется как значение одного пикселя. Это позволяет использовать все значения, для которых 7-й и 8-й биты не установлены одновременно. Таким образом, все значения меньше 192 могут быть закодированы одним байтом. Из-за использования двух старших битов в качестве флагов, значения пикселей от 192 до 255 (с уже установленным старшим битом) должны храниться в паре байтов RLE, даже если они встречаются только один или два раза подряд, в то время как цветовые индексы от 0 до 191 могут храниться непосредственно или в парах байтов RLE (в зависимости от того, что более эффективно по объему); следовательно, степень сжатия может быть оптимизирована при правильной сортировке элементов палитры, хотя это нецелесообразно, если файл должен совместно использовать свою цветовую палитру с другими изображениями. Например, палитру можно оптимизировать, разместив наиболее часто используемые цвета в позициях палитры от 0 до 191, а наименее распространенные цвета – в оставшейся четверти палитры. Еще одна неэффективность алгоритма RLE заключается в возможности хранения блоков нулевой длины, что допускает наличие пустых мест в файле. Это позволяло немного быстрее распаковывать файлы PCX на процессорах, для которых они изначально предназначались. Алгоритм сжатия PCX требует очень мало вычислительной мощности и памяти, что было важным фактором для компьютерных систем во время его разработки. Алгоритмы сжатия, используемые в более новых форматах изображений, более эффективны при сжатии изображений, таких как фотографии, и растрированных или других сложных графических изображений.

Цветовая палитра

В заголовке файла PCX предусмотрено место для 16-цветной палитры. Когда появилась 256-цветная VGA-аппаратура, в файле PCX оказалось недостаточно места для палитры; даже 54 неиспользуемых байта после заголовка были недостаточны. Решением стало размещение палитры в конце файла вместе с маркером, подтверждающим её наличие. Если файл PCX содержит 256-цветную палитру, она располагается на расстоянии 768 байт от конца файла. В этом случае значение байта, предшествующего палитре, должно быть равно 12 (0x0C). Палитра хранится как последовательность RGB-троек, а её полезная длина определяется количеством цветов в изображении. Значения цветов в палитре PCX всегда представлены 8 битами, независимо от глубины цвета изображения.