いつもお世話になっています。
現在、ダイアログにはったピクチャーボックスに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はパレットを持っている時というわけではないんですね。
ありがとうございました。

 
  
  
  
  