BITMAPFILEHEADERにおけるbfOffBitsの理解


以前はBITMAPFILEHEADER構造のbfOffBitsというメンバーに疑問を抱いていた.MSDNが与える定義は
        Specifies the offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
私はまだぼんやりしていると思って、自分でコードを書いてテストしました.
ReadFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), 					//hFile ( )
	&dwByteRead, NULL) ;
wsprintf (szBuffer, TEXT ("iInfoSize = %d, bfSize = %d, bfOffBits = %d\r
//bmfh BITMAPFILEHEADER = %d, WORD = %d, DWORD = %d\r
//iInfoSize = bmfh.bfOffBits - sizeof (BITMAPFILEHEADER) BITMAPINFO = %d, BITMAPINFOHEADER = %d, BITMAPV5HEADER = %d\r
BITMAPV4HEADER = %d, RGBQUAD = %d, NumberOfRGBQUAD = %d"), iInfoSize, bmfh.bfSize, bmfh.bfOffBits, sizeof (BITMAPFILEHEADER), sizeof (WORD), sizeof (DWORD), sizeof (BITMAPINFO), sizeof (BITMAPINFOHEADER), sizeof (BITMAPV5HEADER), sizeof (BITMAPV4HEADER), sizeof (RGBQUAD), (bmfh.bfOffBits - 54) / sizeof (RGBQUAD)) ; MessageBox (hwnd, szBuffer, szAppName, MB_OK) ;

私はグラフィックソフトで勝手にbmpを作成し、単色、16色、256色、24ビットの4つのフォーマットに保存しました.
モノクロビットマップ:
iInfoSize = 48,bfSize = 3478,bfOffBits = 62
BITMAPFILEHEADER = 14,WORD = 2,DWORD = 4
BITMAPINFO = 44,BITMAPINFOHEADER = 40,BITMAPV5HEADER = 124,
BITMAPV4HEADER = 108,RGBQUAD = 4,NumberOfRGBQUAD = 2
16色ビットマップ:
iInfoSize = 104,bfSize = 13782,bfOffBits = 118
BITMAPFILEHEADER = 14,WORD = 2,DWORD = 4
BITMAPINFO = 44,BITMAPINFOHEADER = 40,BITMAPV5HEADER = 124,
BITMAPV4HEADER = 108,RGBQUAD = 4,NumberOfRGBQUAD = 16
256色のビットマップ:
iInfoSize = 1064,bfSize = 28406,bfOffBits = 1078
BITMAPFILEHEADER = 14,WORD = 2,DWORD = 4
BITMAPINFO = 44,BITMAPINFOHEADER = 40,BITMAPV5HEADER = 124,
BITMAPV4HEADER = 108,RGBQUAD = 4,NumberOfRGBQUAD = 256
24ビットカラービットマップ:
iInfoSize = 40,bfSize = 82038,bfOffBits = 54
BITMAPFILEHEADER = 14,WORD = 2,DWORD = 4
BITMAPINFO = 44,BITMAPINFOHEADER = 40,BITMAPV5HEADER = 124,
BITMAPV4HEADER = 108,RGBQUAD = 4,NumberOfRGBQUAD = 0
上の4組のデータを比較するとiInfoSize,bfSize,bfOffBits,NumberOfRGBQUADのみが変化していることがわかり(これはちょっとくだらない話)、よく見ると
bfOffBits = sizeof (BITMAPFILEHEADER) + NumberOfRGBQUAD * sizeof (RGBQUAD)  + sizeof (BITMAPINFOHEADER);
RGBQUADはいわゆる色対照表です.
したがって、MSDNでいう「bfOffBitsとは、ビットマップファイルヘッダからビットマップデータへのオフセット量」とは、ビットマップヘッダ情報(BITMAPFILEHEADER)+ビットマップ情報ヘッダ(BITMAPINFOHEADER)+全色照合テーブル(RGBQUAD)のバイト数を意味する.