DIB – プログラミング – Home

通知
すべてクリア

[解決済] DIB


champ
 champ
(@champ)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

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;

}


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

> 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;
でもいいかも知れませんが。


返信引用
champ
 champ
(@champ)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

回答どうもありがとうございます。
ズバリな解説ありがとうございます。
>sizeof(WORD)+sizeof(DWORD)+sizeof(WORD)+sizeof(WORD)で求まるかと。
なるほどこんな風に求めてるとは想像がつきませんでした。
オフセットの例もとても参考になりました。
どうもありがとうございました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました