- 締切済み
画像操作について2
どなたか助けてください。 下記ソースをチェックしていただけないでしょうか? ビットマップ画像処理を行うために、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; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- a--he
- ベストアンサー率0% (0/0)
上のソースコードに対して質問していいですか。 MemDCは作っただけでどこにも使われてないのですが、、 また、m_pbg1dcは? CreateDIBSectionはあまり使ったことがなくてよくわかりませんが、、 SelectObject(MemDC.m_hDC,hBmp); などで指定するBitmapはDC交換性を持たなければいけないと思いますけど、、
- a--he
- ベストアンサー率0% (0/0)
こんにちは、 私も似たようなプログラムを組んでます。 まず一つの間違いとしては、、、最後の行の 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の中身を操作して表示させようとしています。