プロが教えるわが家の防犯対策術!

どなたか助けてください。

下記ソースをチェックしていただけないでしょうか?
ビットマップ画像処理を行うために、CreateDIBSection()で編集領域を
確保して、imageにコピーして画像操作を行いたいのですが、
Debug Assertion Failedというエラーがでます。

知識不足ということもあり、ソース自体に問題がある可能性の方が高いのですが、
根本的に画像操作に対する考え方が間違っているのでしょうか?

ご教授よろしくお願い致します。

環境はVC++6.0 MFC ダイアログベースです

BOOL C***Dlg::*******()
{

HBITMAP hBmp;
BITMAPINFOHEADER bi;
unsigned *bmbuf;

image , MemDC, MemDC2はPublicです。

bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = 16;
bi.biHeight = -40; //top-down
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

hBmp=CreateDIBSection(NULL,
(LPBITMAPINFO)&bi,
DIB_RGB_COLORS,
(void **)(&bmbuf),
NULL,
0);

CDC* pDC = this->GetDC();

MemDC.CreateCompatibleDC(pDC);
SelectObject(MemDC.m_hDC,hBmp);

MemDC2.CreateCompatibleDC(pDC);
HBITMAP h_BMP =
(HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_******),
IMAGE_BITMAP, 16, 40, LR_CREATEDIBSECTION);

HBITMAP h_OLD_BMP = (HBITMAP)::SelectObject(MemDC2.m_hDC,h_BMP);

m_pbg1dc->BitBlt(42,16,100,100,&MemDC2,0,0,SRCCOPY);
memcpy(image, bmbuf, 16 * 40 * 4);

::SelectObject(MemDC2.m_hDC,h_OLD_BMP);
MemDC2.DeleteDC();

DeleteObject(hBmp);

return TRUE;

}

A 回答 (2件)

こんにちは、


私も似たようなプログラムを組んでます。
まず一つの間違いとしては、、、最後の行の
DeleteObject(hBmp);
はやってはいけないと思います。MemDCが使用中ですから、、
::SelectObject(MemDC2.m_hDC,h_OLD_BMP);
のようにMemDCにも戻してください。
imageは配列ですか?

私のやり方は多少違います。CBitmapクラスを使ってます。
CBitmap::CreateCompatibleBitmapが作ってくれるはずです。
また、余計な話ですけど、、どうせMFCを使うんであれば、
SelectObject(MemDC.m_hDC,hBmp);

MemDCSelectObject(hBmp);
のように記述したほうがわかりやすいと思います。

この回答への補足

imageは二次元配列です。
CreateDIBSectionの戻り値のバッファをコピーしてます。
このimageの中身を操作して表示させようとしています。

補足日時:2001/06/18 16:32
    • good
    • 0

上のソースコードに対して質問していいですか。


MemDCは作っただけでどこにも使われてないのですが、、
また、m_pbg1dcは?
CreateDIBSectionはあまり使ったことがなくてよくわかりませんが、、

SelectObject(MemDC.m_hDC,hBmp);
などで指定するBitmapはDC交換性を持たなければいけないと思いますけど、、
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!