読み込んだ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)なっているのでしょうか?
どこに画像データが有るのでしょうか?
お礼
ご回答ありがとうございます。 解像度を正常に動作するパソコンの設定と同じにしたら問題は解決致しました。 ありがとうございました。 何故、解像度が違うことでそのような事が発生するのでしょうか?