PCX - один из самых старейших форматов графических данных, который разработала фирма ZSoft. Если ты решил написать программу, которая должны будет работать с графикой, то поддержка этого формата обязательна. Не смотря на то, что этот формат не позволяет хранить анимацию, как это делает GIF, он всё же получил большое распространение. Практически все графические редакторы поддерживают его, поэтому ты обязан его знать.
Как и любой другой графический формат, PCX состоит из заголовка и растровых данных. Заголовок имеет размер 128 байт, а всё остальное в файле - сжатые растровые данные. Для сжатия используется наверно самый простой алгоритм, не считая абсолютно не сжатых данных.
Алгоритм очень прост, если в файле используются данные достаточно большого разрешения. Я имею в виду 256 цветов. Когда используется 16 битный цвет или ещё меньше, то растровые данные сохраняются по плоскостям, т.е. каждая цветовая плоскость отдельно. В 256-и цветных картинках, для описания одного пикселя требуется 8 бит, поэтому сжатие происходит последовательно каждого пикселя, без разделения на плоскости. Я буду рассматривать только 256 кодирование.
Хватит вступительных слов, давай перейдём к рассмотрению заголовка PCX файла:
Смещение
Условное обозначение
Длина
Описание
0
Signature
1
Обязательно должно быть 10. Это подтверждает, что файл
действительно относиться к PCX
формату фирмы ZSoft
1
Version
1
Информация о версии. Возможны значения:
0 – версия 2,5
2 – версия 2,8 с палитрой
3 – версия 2,8 без палитры
5 – версия 3,0
2
Encoding
1
PCX
кодирование длинными сериями
3
Bits per
Pixel
1
Число бит на пиксель. Я рассматриваю только 8 бит. С
плоскостями я не дружу.
4
Left
2
Левая позиция экрана
6
Top
2
Верхняя позиция экрана
7
Width
2
Ширина экрана
10
Height
2
Высота экрана
12
HorRes
2
Горизонтальное разрешение создающего устройства
14
VerRes
2
Вертикальное разрешение создающего устройства
16
Colormap
48
Набор цветовой палитры
64
Reserved
1
Оставлено до лучших времён
65
Nplanes
1
Число цветовых слоёв
66
Bytes per
Line
2
Число байт на строку в цветовом слое (для PCX-файлов
всегда должно быть четным)
68
PaletteInfo
2
Как ты должен понимать палитру. Возможны значения:
1 - цветная/черно-белая,
2 - градации серого
70
Filler
58
Заполняется нуликами до самого конца заголовка.
Замечание к палитре. Я подразумеваю, что палитра есть, а если это так, то её надо искать в конце файла. Для этого надо перейти в конец файла и оттуда отсчитать 769 (256*3) байт. После этого, со следующей позиции файла начинается палитра.
Теперь поговорим о кодировании. Оно происходит довольно просто. Читаешь символ, если он больше чем 192, то значение символа минус192 будет равно количеству повторений следующего символа. Читай следующий символ и повторяй его столько, сколько высчитал на предыдущем этапе. После этого, снова читаешь следующий символ. Если он меньше 192, то это простое значение цвета, и ты можешь смело его выводить на экран. Читай следующий символ и проверяй на соответствие 192.
Если чё не понятно, то перечитай заново. Всё очень даже просто и никаких подводных плит.
Если ты собрался закодировать PCX файл, то ты можешь нарваться на проблему. Когда будешь кодировать значение цвета, например, 195, то запиши его в файл как пара чисел 193 195. Если ты просто запишешь 195, то при распаковке наткнёшься на проблему, потому что 195 - больше чем 192. Если не понял в чём проблема, то перечитай про распаковку. Если ты запишешь как два числа 193 195, то при распаковке ты встретишь 193 и повторишь символ 195 ровно 193-192 раз, то есть один раз.
Почему этот алгоритм эффективен? Да потому что в любой картинке очень много идущих подряд повторяющихся цветов. С помощью этого алгоритма длинные последовательности цветов превращаются в два байта.
Всё очень просто и никаких загадок. Если ты не индеец, то этой инфы тебе будет достаточно.