Введение
Формат файла изображения PCX, расшифровывающийся как PiCture eXchange, — это формат файла изображения, разработанный ныне не существующей компанией ZSoft Corporation из Мариетты, штат Джорджия, США. Он являлся родным форматом для PC Paintbrush и стал одним из первых широко распространенных стандартов обработки изображений в DOS, хотя впоследствии был вытеснен более совершенными форматами, такими как BMP, JPEG и PNG. Файлы PCX обычно хранят изображения с палитрой, индексированные от 2 или 4 цветов до 16 и 256 цветов, хотя формат был расширен и для записи изображений в истинных цветах (24 бита).
the image file format
PCX, standing for PiCture eXchange, is an image file format developed by the now defunct ZSoft Corporation of Marietta, Georgia, United States. It was the native file format for PC Paintbrush and became one of the first widely accepted DOS imaging standards, although it has since been succeeded by more sophisticated image formats, such as BMP, JPEG, and PNG. PCX files commonly store palette indexed images ranging from 2 or 4 colors to 16 and 256 colors, although the format has been extended to record true color (24 bit) images as well.
Форматы изображений 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 is supported by common image processing software including ACDSee, FastStone, GIMP, ImageMagick, IrfanView, LView, Netpbm, PaintShop Pro, Photoshop, Visio, PMview, XnView and GraphicConverter. In version 2.1.4 FFmpeg could encode and decode the PCX pixel formats rgb24, rgb8, bgr8, rgb4 byte, bgr4 byte, gray, pal8, and monob. There is a multi page version of PCX, used by some computer fax and document management programs, with file extension dcx. A DCX file consists of a header introducing a set of following PCX files.
Макет данных изображения
Данные изображения PCX хранятся в строках или линиях сканирования сверху вниз. Если изображение состоит из нескольких плоскостей, они хранятся последовательно по плоскостям в каждой строке: сначала все данные красного цвета для строки 0, затем все данные зеленого цвета для строки 0, затем синего и, наконец, альфа-канала. Этот шаблон повторяется для каждой строки, как показано в следующей таблице:
+ PCX Image Data Arranged into Color Planes Row 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 Row 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 Row 2 etc. When an image is less than 8 bits per pixel, each line is padded to the next even byte boundary. For example, if an image has 1 plane of 1 bit data (monochrome) with a width of 22 pixels, each row will be 4 bytes long, having 32 bits per row with 10 bits unused.
+ Данные изображения 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 и т.д.
+ PCX Image Data Arranged into Color Planes Row 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 Row 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 Row 2 etc. When an image is less than 8 bits per pixel, each line is padded to the next even byte boundary. For example, if an image has 1 plane of 1 bit data (monochrome) with a width of 22 pixels, each row will be 4 bytes long, having 32 bits per row with 10 bits unused.
Если глубина цвета изображения меньше 8 бит на пиксель, каждая строка дополняется до следующей четной границы байта. Например, если изображение имеет 1 плоскость данных размером 1 бит (монохромное) и шириной 22 пикселя, каждая строка будет иметь длину 4 байта, то есть 32 бита в строке, из которых 10 бит не используются.
+ PCX Image Data Arranged into Color Planes Row 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 Row 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 Row 2 etc. When an image is less than 8 bits per pixel, each line is padded to the next even byte boundary. For example, if an image has 1 plane of 1 bit data (monochrome) with a width of 22 pixels, each row will be 4 bytes long, having 32 bits per row with 10 bits unused.
Сжатие данных изображения
Данные изображения PCX сжимаются с помощью кодирования длины серии (RLE) – простого алгоритма сжатия без потерь, который объединяет последовательность из трех и более одинаковых байтов в пару из двух байтов. Два старших бита байта используются для определения, представляют ли данные отдельный пиксель с заданным индексом палитры или цветовым значением, или пару RLE, представляющую серию пикселей с одним и тем же значением: если оба бита установлены в 1, байт интерпретируется как длина серии. Это оставляет 6 бит для фактического значения длины серии, в диапазоне от 0 до 63. В любом другом случае байт интерпретируется как значение одного пикселя. Это позволяет использовать все значения, для которых 7-й и 8-й биты не установлены одновременно. Таким образом, все значения меньше 192 могут быть закодированы одним байтом. Из-за использования двух старших битов в качестве флагов, значения пикселей от 192 до 255 (с уже установленным старшим битом) должны храниться в паре байтов RLE, даже если они встречаются только один или два раза подряд, в то время как цветовые индексы от 0 до 191 могут храниться непосредственно или в парах байтов RLE (в зависимости от того, что более эффективно по объему); следовательно, степень сжатия может быть оптимизирована при правильной сортировке элементов палитры, хотя это нецелесообразно, если файл должен совместно использовать свою цветовую палитру с другими изображениями. Например, палитру можно оптимизировать, разместив наиболее часто используемые цвета в позициях палитры от 0 до 191, а наименее распространенные цвета – в оставшейся четверти палитры. Еще одна неэффективность алгоритма RLE заключается в возможности хранения блоков нулевой длины, что допускает наличие пустых мест в файле. Это позволяло немного быстрее распаковывать файлы PCX на процессорах, для которых они изначально предназначались. Алгоритм сжатия PCX требует очень мало вычислительной мощности и памяти, что было важным фактором для компьютерных систем во время его разработки. Алгоритмы сжатия, используемые в более новых форматах изображений, более эффективны при сжатии изображений, таких как фотографии, и растрированных или других сложных графических изображений.
If both bits are 1, the byte is interpreted as the run length. This leaves 6 bits for the actual run length value, a range of 0 63. In any other case, the byte is interpreted as a single pixel value. This leaves all values for which bit #7 and bit #8 are not 1 at the same time. This allows all values under 192 to be encoded in a single byte. Due to the use of the two most significant bits as flags, pixel values from 192 to 255 (with their most significant bit already set) must be stored in an RLE byte pair, even when they only occur one or two pixels in succession, whereas color indexes 0 to 191 can be stored directly or in RLE byte pairs (whichever is more space efficient); therefore, the actual compression ratio could be optimized with proper sorting of palette entries, though this is not feasible where the file must share its color palette with other images. For example, a palette could be optimized with the most commonly used colors occurring in palette positions 0 to 191 and the least common colors allocated to the remaining quarter of the palette. Another inefficiency with the RLE algorithm is that it is possible to store chunks with a length of 0, which allows whitespace in the file. This allowed PCX files to be decompressed slightly faster on the processors it was originally intended for. The PCX compression algorithm requires very little processor power or memory to apply, a significant concern with computer systems when it was designed. Compression algorithms used by newer image formats are more efficient when compressing images such as photographs, and dithered or otherwise complex graphics.
Цветовая палитра
В заголовке файла PCX предусмотрено место для 16-цветной палитры. Когда появилась 256-цветная VGA-аппаратура, в файле PCX оказалось недостаточно места для палитры; даже 54 неиспользуемых байта после заголовка были недостаточны. Решением стало размещение палитры в конце файла вместе с маркером, подтверждающим её наличие. Если файл PCX содержит 256-цветную палитру, она располагается на расстоянии 768 байт от конца файла. В этом случае значение байта, предшествующего палитре, должно быть равно 12 (0x0C). Палитра хранится как последовательность RGB-троек, а её полезная длина определяется количеством цветов в изображении. Значения цветов в палитре PCX всегда представлены 8 битами, независимо от глубины цвета изображения.