電子書籍の厳選無料作品が豊富!

質問タイトルにも記載していますが、

「DIBヘッダへのポインタ」とは具体的にはどういうものなのでしょうか?

ご回答の程よろしくお願いいたします。

A 回答 (3件)

 御礼いただきました。

えぇと、要はDIBファイルを読み込みたいのでしょうか。

>>こちらをコピペしてコンパイルしてみましたが「hDib」が定義されていないと出ました。
 すいません。中途半端すぎました。

>>これはどうすればよいのでしょうか?
 プログラム内で使用する為にビットマップハンドルを作成します。
 作成したビットマップハンドルに対して、DIBヘッダへのポインタ等を使用して書き込みします。

 局所的に言及して説明出来る代物では無いので、以下を参考にしてみてください。
 DIBファイルを読み込んでウィンドウに表示します。デバッガで追跡してDIBヘッダの中身などを確認してみてください。

#include<windows.h>
#include<stdio.h>

//バッファを作成してファイルを丸ごと読み込む
static BYTE* CreateBufferFromFile(const char* pszFileName)
{
FILE* pf = ::fopen(pszFileName, "rb");
::fseek(pf, 0, SEEK_END);
const long size = ::ftell(pf);
::rewind(pf);
BYTE* pFileBuf = (BYTE*)::malloc(size);
::fread(pFileBuf, size, 1, pf);
::fclose(pf);
return pFileBuf;
}

//バッファを消す
static void DeleteBuffer(BYTE* pFileBuf)
{
::free(pFileBuf);
}

//ビットマップを作成する
static HBITMAP ReadDIB(const BYTE* pFileBuf)
{
//ファイル先頭のポインタ
const LPBITMAPFILEHEADER ph = (LPBITMAPFILEHEADER)(pFileBuf);

//DIBヘッダーのポインタ
const LPBITMAPINFO pbmi= (LPBITMAPINFO)(pFileBuf + sizeof(BITMAPFILEHEADER));

//ビットイメージ先頭のポインタ
const void* pSrc= pFileBuf + ph->bfOffBits;

//デスクトップウィンドウのデバイスコンテキストを作成する
HWND hWndDesktop= ::GetDesktopWindow();
HDC hDCDesktop= ::GetDC(hWndDesktop);

//プログラム内で使用するためのビットマップを作成する。フォーマットはデスクトップと同じにする
HBITMAP hBitmap= ::CreateCompatibleBitmap(hDCDesktop, pbmi->bmiHeader.biWidth, pbmi->bmiHeader.biHeight);
::ReleaseDC(hWndDesktop, hDCDesktop);

//ビットマップハンドルの為のデバイスコンテキストを作成する
HDC hDCBitmap = ::CreateCompatibleDC(NULL);
::SelectObject(hDCBitmap, hBitmap);

//DIBヘッダのポインタを使用して、hDstに対して書き込む
::SetDIBits(hDCBitmap, hBitmap, 0, pbmi->bmiHeader.biHeight, pSrc, pbmi, DIB_RGB_COLORS);
::DeleteDC(hDCBitmap);

return hBitmap;
}

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitmap = 0;

switch(uMsg)
{
case WM_CREATE:
{
BYTE* pFileBuf = ::CreateBufferFromFile("ビットマップファイル名");
hBitmap = ::ReadDIB(pFileBuf);
::DeleteBuffer(pFileBuf);
return TRUE;
}

case WM_CLOSE:
::DestroyWindow(hWnd);
return FALSE;

case WM_DESTROY:
::DeleteObject(hBitmap);
::PostQuitMessage(0);
return FALSE;

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = ::BeginPaint(hWnd, &ps);

//ビットマップハンドルから情報を取る
BITMAP bmp;
::GetObject(hBitmap, sizeof(bmp), &bmp);

//描写する
HDC hDCSrc = ::CreateCompatibleDC(NULL);
::SelectObject(hDCSrc, hBitmap);
::BitBlt(hDC, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCSrc, 0, 0, SRCCOPY);
::DeleteDC(hDCSrc);

::EndPaint(hWnd, &ps);
}

default:break;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
    • good
    • 0
この回答へのお礼

お礼が遅れました。

今行っているのは画像表示の際にDIBヘッダが必要というものでございまして。

今回はいろんな意見を聞いて、解決することができました。

今回教えていただいたものは今後、プログラムに役立てて行きたいと思います。

ありがとうございました。

お礼日時:2008/10/01 09:54

 こんにちは。


 BMPファイル(又はそれを読み込んだバッファー)の先頭から、sizeof(BITMAPFILEHEADER)バイト分下にずらした位置の事ではないでしょうか。
 大体、こんな感じです。

HBITMAP ReadDIB(const BYTE* pFileBuf)
{
//ファイル先頭のポインタ
const LPBITMAPFILEHEADER ph = (LPBITMAPFILEHEADER)(pFileBuf);

//DIBヘッダーのポインタ
const LPBITMAPINFO pbmi= (LPBITMAPINFO)(pFileBuf + sizeof(BITMAPFILEHEADER));

//ビットイメージ先頭のポインタ
const void* pSrc= pFileBuf + ph->bfOffBits;

//作成してビットマップハンドルを返す
return hDib;
}
    • good
    • 0
この回答へのお礼

こちらをコピペしてコンパイルしてみましたが「hDib」が定義されていないと出ました。

これはどうすればよいのでしょうか?

お礼日時:2008/09/29 10:37

DIBヘッダがわかりません?


それともポインタ?

DIBヘッダなら
http://wisdom.sakura.ne.jp/system/winapi/win32/w …
あたりがかなり具体的に書いてあると思いますよ。
    • good
    • 0
この回答へのお礼

DIBファイルもポインタもわかるんですが、

「DIBヘッダへのポインタ」というのがわかりません。


DIB構造体って確か4種類ぐらいありますよね。

それのすべてDIBヘッダというのですか?

お礼日時:2008/09/29 09:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!