BITMAPFILEHEADERにおけるbfOffBitsの理解
以前はBITMAPFILEHEADER構造のbfOffBitsというメンバーに疑問を抱いていた.MSDNが与える定義は
Specifies the offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
私はまだぼんやりしていると思って、自分でコードを書いてテストしました.
私はグラフィックソフトで勝手に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)のバイト数を意味する.
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)のバイト数を意味する.