いつもお世話になっています。
現在、ダイアログにはったピクチャーボックスにStretchDIBitsを使用して画像を表示し
ようとしています。
以下のソースを実行させたのですが、真っ白な画像を表示させても真っ黒が表示されま
す。
どこが悪いのかわかりません。
ご指導をお願いいたします。
----------実行コード----------
typedef struct PM_IMAGE_FILTER_LIST_ {
char pszFileName[MAX_PATH]; // 元画像のファイルPath
int iWidth; // 元画像の幅
int iHeight; // 元画像の高さ
DWORD dwSize; // DIB画像のサイズ
LPBYTE lpDib; // DIB画像へのポインタ
LPBITMAPINFObiBuf; // 画像情報へのポインタ
} PM_IMAGE_FILTER_LIST, *LP_PM_IMAGE_FILTER_LIST;
画像展開関数{
HANDLE hdlBmp; // ファイルのハンドル
BITMAPFILEHEADER bfhBmp; // ビットマップファイル情報の構造体
DWORD dwdFileSize =0; // 読み込んだサイズ
DWORD dwdPixelsSize=0; // 色情報のサイズ
// ファイルを開く
hdlBmp = CreateFile(myImage[index].pszFileName,
GENERIC_READ, 0, NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hdlBmp==INVALID_HANDLE_VALUE){
MessageBox(読込みに失敗しました, NULL, MB_OK);
return;
}
// ファイル情報部分を読み込む
ReadFile(hdlBmp, &bfhBmp, sizeof(BITMAPFILEHEADER), &dwdFileSize, NULL);
// ビットマップ情報部分を読み込む
dwdPixelsSize = bfhBmp.bfOffBits - sizeof(BITMAPFILEHEADER);
myImage[index].biBuf=(LPBITMAPINFO)GlobalAlloc(GPTR, dwdPixelsSize);
ReadFile(hdlBmp, myImage[index].biBuf, dwdPixelsSize, &dwdFileSize, NULL);
dwdPixelsSize = bfhBmp.bfSize - bfhBmp.bfOffBits;
myImage[index].lpDib = (LPBYTE)GlobalAlloc(GPTR, dwdPixelsSize);
ReadFile(hdlBmp, myImage[index].lpDib,
dwdPixelsSize, &dwdFileSize, NULL);
}
申し訳ありません。途中で送ってしまいました。再度送らせていただきます。
----------実行コード----------
// ファイルのデータを保存する構造体
typedef struct PM_IMAGE_FILTER_LIST_ {
char pszFileName[MAX_PATH]; // 元画像のファイルPath
int iWidth; // 元画像の幅
int iHeight; // 元画像の高さ
DWORD dwSize; // DIB画像のサイズ
LPBYTE lpDib; // DIB画像へのポインタ
LPBITMAPINFO biBuf; // 画像情報へのポインタ
} PM_IMAGE_FILTER_LIST, *LP_PM_IMAGE_FILTER_LIST;
// ヘッダーファイル内で宣言
PM_IMAGE_FILTER_LIST myImage; // ファイル情報を保存する変数
画像展開関数{
HANDLE hdlBmp; // ファイルのハンドル
BITMAPFILEHEADER bfhBmp; // ビットマップファイル情報の構造体
DWORD dwdFileSize =0; // 読み込んだサイズ
DWORD dwdPixelsSize=0; // 色情報のサイズ
// 指定のファイルをファイルを開く
hdlBmp = CreateFile(myImage.pszFileName, // 開くファイル名
GENERIC_READ, 0, NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hdlBmp==INVALID_HANDLE_VALUE){
MessageBox(読込みに失敗しました, NULL, MB_OK);
return;
}
// ファイル情報部分を読み込む
ReadFile(hdlBmp, &bfhBmp, sizeof(BITMAPFILEHEADER), &dwdFileSize, NULL);
// ビットマップ情報部分を読み込む
dwdPixelsSize = bfhBmp.bfOffBits - sizeof(BITMAPFILEHEADER);
myImage.biBuf=(LPBITMAPINFO)GlobalAlloc(GPTR, dwdPixelsSize);
ReadFile(hdlBmp, myImage.biBuf, dwdPixelsSize, &dwdFileSize, NULL);
// ビットマップのデータ部分を読み込む
dwdPixelsSize = bfhBmp.bfSize - bfhBmp.bfOffBits;
myImage.lpDib = (LPBYTE)GlobalAlloc(GPTR, dwdPixelsSize);
ReadFile(hdlBmp, myImage.lpDib, dwdPixelsSize, &dwdFileSize, NULL);
// ファイルを閉じる
CloseHandle(hdlBmp);
}
画像描画関数{
int rst;
BITMAPINFOHEADER lpbi;
lpbi = myImage.biBuf->bmiHeader;
// デバイスコンテキストの獲得
CWnd* h = GetDlgItem(IDC_PICTURE1); // ピクチャーボックスのデバイスコンテキスト
CDC* pDC = h->GetDC();
// クライアント領域の長方形の獲得
CRect r;
h->GetClientRect(&r);
// クリッピング領域の設定
CRgn s;
s.CreateRectRgn(r.left, r.top, r.right, r.bottom);
pDC->SelectClipRgn(&s);
// ビットマップ伸縮モードを設定
int nBltMode = SetStretchBltMode(pDC->m_hDC, WHITEONBLACK);
// 描画
if (lpbi.biBitCount <= 8) { // パレットを持つ画像のとき
rst = StretchDIBits(pDC->m_hDC, 0, 0, r.right, r.bottom, 0, 0,
lpbi.biWidth, lpbi.biHeight,
myImage.lpDib, myImage.biBuf,
DIB_PAL_COLORS, SRCCOPY);
}else{ // パレットを持たない画像のとき
rst = StretchDIBits(pDC->m_hDC, 0, 0, r.right, r.bottom, 0, 0,
lpbi.biWidth, lpbi.biHeight,
myImage.lpDib, myImage.biBuf,
DIB_RGB_COLORS, SRCCOPY);
}
nBltMode = SetStretchBltMode(pDC->m_hDC, nBltMode);
// クリッピング領域の削除
s.DeleteObject();
// デバイスコンテキストの解放
h->ReleaseDC(pDC);
}
----------実行コード----------
ある関数内で、画像展開関数・画像描画関数を続けて呼び出しています。
これを実行すると、パレットをもつ画像の時のみ画像が黒く表示されます。
(パレットを持たない画像だと表示されます。)
StretchDIBitsの戻り値はエラーを返していません。
また、
SetStretchBltModeのWHITEONBLACKをSTRETCH_DELETESCANS・STRETCH_HALFTONEに変えて
見ましたがうまくいきませんでした。
CreateFileで取得した情報は開いた画像の情報が入っています。
パレットの情報もちゃんと取り出せていました。
何がいけないのか、わかる方がいらっしゃいましたらご指導お願いいたします。
長い質問で失礼いたします。
MFC使用。VS.net・WindowsXP
> if (lpbi.biBitCount <= 8) { // パレットを持つ画像のとき
> rst = StretchDIBits(pDC->m_hDC, 0, 0, r.right, r.bottom, 0, 0,
> lpbi.biWidth, lpbi.biHeight,
> myImage.lpDib, myImage.biBuf,
> DIB_PAL_COLORS, SRCCOPY);
> }else{ // パレットを持たない画像のとき
この処理そのものが要らないでしょう。
DIB_PAL_COLORSの意味を取り違えているような気がします。
Kerryさん 返信ありがとうございます。
できました。
描画関数の描画部分を教えていただいたとおり
画像描画関数の描画部分{
// ビットマップ伸縮モードを設定
int nBltMode = SetStretchBltMode(pDC->m_hDC, WHITEONBLACK);
// 描画
rst = StretchDIBits(pDC->m_hDC, 0, 0, r.right, r.bottom, 0, 0,
lpbi.biWidth, lpbi.biHeight,
myImage.lpDib, myImage.biBuf,
DIB_RGB_COLORS, SRCCOPY);
nBltMode = SetStretchBltMode(pDC->m_hDC, nBltMode);
}
に修正すると描画されるようになりました。
DIB_PAL_COLORSはパレットを持っている時というわけではないんですね。
ありがとうございました。