offset = *(LPDWORD)(lpBuf + 10);
の10はどこから来ているのでしょうか?
アドバイスをお願いします。
/* ビットマップ読み込み */
void readButt(LPCTSTR lpszFn) {
DWORD offset, dummy;
LPBYTE lpBuf, lpPix;
int i, j;
LPBITMAPINFO lpWrkBM;
HANDLE fh;
/* BMPを開く */
fh = CreateFile( lpszFn, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
/* BMP読み込みバッファ確保 */
lpBuf = (LPBYTE)GlobalAlloc(GPTR, GetFileSize(fh, NULL));
ReadFile(fh, lpBuf, GetFileSize(fh, NULL), &dummy, NULL);
/* BMP内のBITMAPINFO取得 */
lpWrkBM = (LPBITMAPINFO)(lpBuf + sizeof(BITMAPFILEHEADER));
/* バッファ先頭からピクセル列までのオフセット取得 */
offset = *(LPDWORD)(lpBuf + 10);
/* ピクセル列の先頭アドレス設定 */
lpPix = lpBuf + offset;
CloseHandle(fh);
if (lpWrkBM->bmiHeader.biWidth != 480 ||
lpWrkBM->bmiHeader.biHeight != 320) {
MessageBox(hwMain, BMPのデータが異常です。, エラー, MB_OK);
return;
}
for (i = 0;i < 320;i++) {
for (j = 0;j < 480;j++) {
CopyMemory(lpButt + j + i * 480,
lpPix + j * 3 + i * 480 * 3, 3);
}
}
GlobalFree(lpBuf);
return;
}
> offset = *(LPDWORD)(lpBuf + 10);
> の10はどこから来ているのでしょうか?
BITMAPFILEHEADER構造体のbfOffBitsメンバですね。
sizeof(WORD)+sizeof(DWORD)+sizeof(WORD)+sizeof(WORD)で求まるかと。
ただ……こういうマジックナンバー使うのはよろしくないかと思います。
BITMAPFILEHEADER *BitmapFileHeader;
として、
ReadFile()の後辺りで、
BitmapFileHeader = (BITMAPFILEHEADER *)lpBuf;
offset = BitmapFileHeader->bfOffBits;
等とやるべきかと。
offset = (BITMAPFILEHEADER *)lpBuf->bfOffBits;
でもいいかも知れませんが。
回答どうもありがとうございます。
ズバリな解説ありがとうございます。
>sizeof(WORD)+sizeof(DWORD)+sizeof(WORD)+sizeof(WORD)で求まるかと。
なるほどこんな風に求めてるとは想像がつきませんでした。
オフセットの例もとても参考になりました。
どうもありがとうございました!