DIB

[戻る]
champ 2007/06/18(月) 22:14:57
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;

}

瀬戸っぷ [E-Mail] 2007/06/18(月) 22:53:25
> 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 2007/06/19(火) 15:57:15
[[解決]]
回答どうもありがとうございます。
ズバリな解説ありがとうございます。
>sizeof(WORD)+sizeof(DWORD)+sizeof(WORD)+sizeof(WORD)で求まるかと。
なるほどこんな風に求めてるとは想像がつきませんでした。
オフセットの例もとても参考になりました。
どうもありがとうございました!

古いスレッドには追加発言できません。