ビットマップのフォーマット

本物のページはこちら→format

Included page "bitmap:format" does not exist (create it now)

bfType=0x4D42でなければビットマップにあらず
たとえば、png方式なのに、拡張子を.bmpとして保存していたとする。
それでもファイルエクスプローラ上で見ても、GIMPとかで開いても何も問題がないかのように振る舞うが、
プログラムしてみると、あれ?これはbmpじゃない!ということがあった。

ビットマップファイル全体の構造

何ビット目? サイズ 構造体 構造体の名前
0 14 ファイルヘッダ BITMAPFILEHEADER
14 40 情報ヘッダ BITMAPINFOHEADER
54 4byte*biBitCount カラーパレット1 RGBQUAD
bfOffBits 画像サイズによりけり 画像データ( ビット配列 )2 byte[biWidth*biHeight*biBitCount/8]3

ファイルヘッダBITMAPFILEHEADER

0 bfType 2byte unsigned int ファイルタイプ 'BM'=0x4D42
2 bfSize 4byte unsigned long ファイルサイズ byte
6 bfReserved1 2byte unsigned int 予約領域1 常に0
8 bfReserved2 2byte unsigned int 予約領域2 常に0
10 bfOffBits 4byte unsigned long ファイル先頭から画像データまでのオフセット(byte)4

16bitは正式には対応していない。作ってみようと試みたがうまくいかなかった。
RGBQUADで作れるパレットの色数の最大数は256らしい。

情報ヘッダBITMAPINFOHEADER

14 biSize 4byte unsigned long 情報ヘッダサイズ[byte] 40
18 biWidth 4byte long 画像の幅[ピクセル]
22 biHeight 4byte long 画像の高さ[ピクセル]
26 biPlanes 2byte unsigned int プレーン数 常に1
28 biBitCount 2byte unsigned int 色ビット数[bit] 1,4,8,(16),24,32
30 biCompression 4byte unsigned long 圧縮形式 0,1,2,3
34 biSizeImage 4byte unsigned long 画像データサイズ[byte]
38 biXPixPerMeter 4byte long 水平解像度[dot/m] 0の場合もある
42 biYPixPerMeter 4byte long 垂直解像度[dot/m] 0の場合もある
46 biClrUsed 4byte unsigned long 格納パレット数[使用色数] 0の場合もある
50 biCirImportant 4byte unsigned long 重要色数 0の場合もある

RGBQUAD

RGBQUADで作れるパレットの色数の最大数は256らしい。

typedef struct tagRGBQUAD {
        BYTE    rgbBlue;   // 青成分
        BYTE    rgbGreen;  // 緑成分
        BYTE    rgbRed;    // 赤成分
        BYTE    rgbReserved;//常に0
} RGBQUAD;

各色ビット数に対応するパレット数の対応表である。計算は簡単。
$2^{b}$b=色ビット数。2のべき乗になっている。
色ビット数 格納パレット数
1bit  2
4bit 16
8bit 256
24bit なし5
32bit なし6

サポートサイト Wikidot.com