StretchDIBitsで画像がピクチャーボックスに表示されない – プログラミング – Home

StretchDIBitsで画像がピク...
 
通知
すべてクリア

[解決済] StretchDIBitsで画像がピクチャーボックスに表示されない


そう
 そう
(@そう)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

いつもお世話になっています。

現在、ダイアログにはったピクチャーボックスに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);


引用未解決
トピックタグ
そう
 そう
(@そう)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

申し訳ありません。途中で送ってしまいました。再度送らせていただきます。

----------実行コード----------

// ファイルのデータを保存する構造体
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


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

> 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の意味を取り違えているような気がします。


返信引用
そう
 そう
(@そう)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

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はパレットを持っている時というわけではないんですね。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました