読み込んだBMPデータの行方
参考書を元にBMPを読み込み、
BYTE*型にデータを移して、画像処理や転送に利用できるようにしたいのですが、
どこに画像データの実体が有るのかがよくわかりません・・。
----------
static LPBYTE lpDIB = NULL;
static LPBITMAPINFO lpbiInfo;
static LPDWORD lpPixel;
LPBYTE lpBMP;
LPBITMAPINFOHEADER lpbiBMPInfo;
LPBYTE lpBMPPixel;
BYTE* ppp;
static int iWidth, iHeight, iLength;
int iFileSize;
DWORD dwOffset;
int i, j;
HANDLE fhBMP;
DWORD dwRead;
HDC hdc;
PAINTSTRUCT ps;
/*BMP取得*/
//ファイルオープン
fhBMP = CreateFile("test.bmp", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fhBMP == INVALID_HANDLE_VALUE) {
MessageBox(NULL, "test.bmpが見つかりません。", "エラー", MB_OK);
return 0;
}
//ファイルサイズ取得
iFileSize = GetFileSize(fhBMP, NULL);
//ファイル読み込みバッファ確保
lpBMP = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, iFileSize);
//ファイル読み込み
ReadFile(fhBMP, lpBMP, iFileSize, &dwRead, NULL);
//ファイルを閉じる
CloseHandle(fhBMP);
//BMP内のBITMAPINFO取得
lpbiBMPInfo = (LPBITMAPINFOHEADER)
(lpBMP + sizeof(BITMAPFILEHEADER));
//先頭からピクセル列までのオフセット取得
dwOffset = *(LPDWORD)(lpBMP + 10);
//BMP内ピクセル列の先頭アドレス計算
lpBMPPixel = lpBMP + dwOffset;
//ビットマップの大きさ取得
iWidth = lpbiBMPInfo->biWidth;
iHeight = lpbiBMPInfo->biHeight;
//BMPピクセル列の1ラインの長さを計算
if (iWidth % 4 == 0) {
iLength = iWidth * 3;
} else {
iLength = iWidth * 3 + (4 - (iWidth * 3) % 4);
}
//DIB用バッファを確保
lpDIB = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(BITMAPINFO) + iWidth * iHeight * 4);
//DIB用ポインタ分配
lpbiInfo = (LPBITMAPINFO)lpDIB;
lpPixel = (LPDWORD)(lpDIB + sizeof(BITMAPINFO));
//BITMAPINFO設定
lpbiInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbiInfo->bmiHeader.biWidth = iWidth;
lpbiInfo->bmiHeader.biHeight = iHeight;
lpbiInfo->bmiHeader.biPlanes = 1;
lpbiInfo->bmiHeader.biBitCount = 32;
lpbiInfo->bmiHeader.biCompression = BI_RGB;
//BMP内のピクセル列を32ビット化してコピー
for (i = 0;i < iHeight;i++)
for (j = 0;j < iWidth; j++)
CopyMemory(lpPixel + j + i * iWidth,
lpBMPPixel + j * 3 + i * iLength, 3);
//ファイル読み込みバッファ解放
HeapFree(GetProcessHeap(), 0, lpBMP);
/*描画*/
hdc = BeginPaint(hWnd, &ps);
//DIBをウインドウのDCに描画
StretchDIBits(hdc, 0, 0, iWidth, iHeight,
0, 0, iWidth, iHeight, lpPixel, lpbiInfo,
DIB_RGB_COLORS,SRCCOPY);
EndPaint(hWnd, &ps);
----------
描画部分のStretchDIBits()を調べて
lpPixelに格納されているように思えたのですが、これはただのDWORDですし。
lpBMPPixelだとしても、描画では全く使われていないのが不可解で。
なぜこう(描画にDWORD)なっているのでしょうか?
どこに画像データが有るのでしょうか?
お礼
ありがとうございます どうもおかしいと思っていたので助かりました
補足
#include <string> using namespace std; int i_th1,i_th2; を追加しThread1&Thread2を DWORD WINAPI Thread1(LPVOID pparam) { PDATA pdata; HDC hdc; string str; char s[99]; pdata = (PDATA)pparam; while (!pdata->th_end) { WaitForSingleObject(pdata->hmutex, INFINITE); hdc = GetDC(pdata->hwnd); str="スレッド1:";str+=itoa(++i_th1,s,10); TextOut(hdc,0,0,str.c_str(), str.size()); Sleep(500); ReleaseDC(pdata->hwnd, hdc); ReleaseMutex(pdata->hmutex); } return 0L; } DWORD WINAPI Thread2(LPVOID pparam) { PDATA pdata; HDC hdc; string str; char s[99]; pdata = (PDATA)pparam; while (!pdata->th_end) { WaitForSingleObject(pdata->hmutex, INFINITE); hdc = GetDC(pdata->hwnd); str="スレッド2:";str+=itoa(++i_th2,s,10); TextOut(hdc,0,20,str.c_str(), str.size()); ReleaseDC(pdata->hwnd, hdc); ReleaseMutex(pdata->hmutex); } return 0L; } と変更したところ 後ろに宣言していたのではi_th1に対してi_th2が桁違いに大きくなっていきますが 前に宣言したらi_th1とi_th2はせいぜい1つ違いを保ちます ということで作者のケアレスミスだと思われます どうもありがとうございました