+-----------------------------+
| PCX File Header (128 Bytes) |
+-----------------------------+
| Pixel Data |
+-----------------------------+
| Palette Separator (0x0C) |
+-----------------------------+
| Palette Data (768 Bytes) |
+-----------------------------+
struct PCXFileHeader {
uint8_t Identifier;
uint8_t Version;
uint8_t Encoding;
uint8_t BitsPerPixel;
uint16_t XStart;
uint16_t YStart;
uint16_t XEnd;
uint16_t YEnd;
uint16_t HorizontalResolution;
uint16_t VerticalResolution;
uint8_t EGAPalette[48];
uint8_t Reserved1;
uint8_t NumBitPlanes;
uint16_t BytesPerScanline;
uint16_t PaletteType;
uint16_t HorizontalScreenSize;
uint16_t VerticalScreenSize;
uint8_t Reserved2[54];
};
Identifier
Version
Encoding
値
0x00
0x01
意味
無圧縮
ランレングス圧縮
BitsPerPixel
XStart, YStart, XEnd, YEnd
画像の幅
画像の高さ
XEnd - XStart + 1
YEnd - YStart + 1
HorizontalResolution, VerticalResolution
EGAPalette
Reserved1
NumBitPlanes
BytesPerScanline
PaletteType
0x01
0x02
モノクロ or カラー画像
グレースケール画像
HorizontalScreenSize, VerticalScreenSize
Reserved2
RLE圧縮されてたりされなかったりしているピクセルデータが入ってます。
データとしてはスキャンライン毎かつプレーン毎に格納されてます。
インデックスカラーの場合
RGBカラーの場合
8bitインデックスカラー画像の場合は、ピクセルデータの後ろに0x0Cが置かれ、その次に768byteのパレットデータが入ってます。
パレットデータは(R, G, B)の3バイトが256個ならんでます
つまりは下みたいなの
#pragma pack(push, 1)
struct Color {
uint8_t r;
uint8_t g;
uint8_t b;
};
struct Palette {
struct Color colors[256];
};
#pragma pack(pop)