• ベストアンサー

DIBヘッダへのポインタ

質問タイトルにも記載していますが、 「DIBヘッダへのポインタ」とは具体的にはどういうものなのでしょうか? ご回答の程よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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); }

takeaduma
質問者

お礼

お礼が遅れました。 今行っているのは画像表示の際にDIBヘッダが必要というものでございまして。 今回はいろんな意見を聞いて、解決することができました。 今回教えていただいたものは今後、プログラムに役立てて行きたいと思います。 ありがとうございました。

その他の回答 (2)

回答No.2

 こんにちは。  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; }

takeaduma
質問者

お礼

こちらをコピペしてコンパイルしてみましたが「hDib」が定義されていないと出ました。 これはどうすればよいのでしょうか?

  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

DIBヘッダがわかりません? それともポインタ? DIBヘッダなら http://wisdom.sakura.ne.jp/system/winapi/win32/win114.html あたりがかなり具体的に書いてあると思いますよ。

takeaduma
質問者

お礼

DIBファイルもポインタもわかるんですが、 「DIBヘッダへのポインタ」というのがわかりません。 DIB構造体って確か4種類ぐらいありますよね。 それのすべてDIBヘッダというのですか?

関連するQ&A

専門家に質問してみよう