+-----------------------------+| 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)