MFC 이미지 띄우고나서 현재 픽처컨트롤 띄운 이미지 저장한 뒤 다시 자동으로 원래 이미지 띄울때 오류가 생깁니다
글쓴이: GyeongIn Bae@Google / 작성시간: 수, 2017/12/06 - 2:05오후
Debug Assertion Failed!
Program: D:\mfcEx\MPCReport\MFCApplication1\Debug\MFCPictureTest.exe
File: d:\program files\microsoft visual studio 12.0\vc\atlmfc\include\atlimage.h
Line: 1607
Expression: hBitmap == m_hBitmap
라는 오류가 뜨면서 프로그램디버깅이 멈춰버립니다
코드중간에
cImage.StretchBlt(pDC->m_hDC, x1, y1, x2, y2, 0, 0, cImage.GetWidth(), cImage.GetHeight(), SRCCOPY);
에서 오류가 일어났고 저장 자체는 재대로 되고 좌표값에는 오류가 없는걸 확인했습니다 아마 pDC->m_hDC 에서 오류가 일어나는것 같네요
그냥 파일 열기만 계속하면 이상이없으나 파일을 저장한뒤에 저 코드가 실행되면 오류가 발생합니다
구글 뒤져보다가 답답해서 올립니다 ㅠㅠ 참고 코드 올려드립니다
void CMFCApplication1Dlg::pictureLoad(){ if (oldCheckImageOp!=90) cImage.Destroy(); HRESULT hr = cImage.Load(filePath); if (FAILED(hr)) //이미지 로드 안되었을때 { return; } checkImageOp = 19; } void CMFCApplication1Dlg::remakePic(){ oldCheckImageOp = checkImageOp; if (checkImageOp == 19){ x1 = 0; y1 = 0; x2 = rcx; y2 = rcy; ox1 = 0; oy1 = 0; ox2 = cImage.GetWidth(); oy2 = cImage.GetHeight(); } if (checkImageOp == 2){ if (y2 != -rcy){ y1 += rcy; y2 -= rcy * 2; oy1 += cImage.GetHeight(); oy2 -= cImage.GetHeight() * 2; } else{ y1 -= rcy; y2 += rcy * 2; oy1 -= cImage.GetHeight(); oy2 += cImage.GetHeight() * 2; } } if (checkImageOp == 3){ if (x2 != -rcx){ x1 += rcx - 1; x2 -= rcx * 2; ox1 += cImage.GetWidth(); -1; ox2 -= cImage.GetWidth() *2; } else{ x1 -= rcx+1; x2 += rcx * 2; ox1 -= cImage.GetWidth(); +1; ox2 += cImage.GetWidth() * 2; } } if (checkImageOp == 4){ } if (checkImageOp == 5){ } checkImageOp = 99; } void CMFCApplication1Dlg::openPicture(){ if (checkImageOp == 0) return; if (checkImageOp == 1){ pictureLoad(); } CDC * pDC; CRect cRect; pDC = m_Picture.GetDC(); m_Picture.GetClientRect(cRect); CBrush cbWhite(RGB(255, 255, 255)); pDC->FillRect(cRect, &cbWhite); pDC->SetStretchBltMode(COLORONCOLOR); if (checkImageOp != 99){ remakePic(); } //test cImage.StretchBlt(pDC->m_hDC, x1, y1, x2, y2, 0, 0, cImage.GetWidth(), cImage.GetHeight(), SRCCOPY);//에러 ReleaseDC(pDC); } void CMFCApplication1Dlg::savePicture(){ testcImage.Create(cImage.GetWidth(), cImage.GetHeight(), 32); /*pDC->DeleteDC();*/ cImage.Destroy(); HRESULT hr = makeNewImage.Load(filePath); if (FAILED(hr)) //이미지 로드 안되었을때 { return; } HDC hProcessDC = makeNewImage.GetDC(); HDC hDC = testcImage.GetDC(); SetStretchBltMode(hDC, COLORONCOLOR); makeNewImage.StretchBlt(hDC, ox1, oy1, ox2, oy2, 0, 0, testcImage.GetWidth(), testcImage.GetHeight(), SRCCOPY); testcImage.ReleaseDC(); testcImage.Save(savefilePath); makeNewImage.ReleaseDC(); testcImage.Destroy(); makeNewImage.Destroy(); //ReleaseDC(pDC); DeleteDC(hProcessDC); DeleteDC(hDC); checkImageOp = 1; oldCheckImageOp = 90; PictureopenDlg(); openPicture(); //에러 }
Forums:
해결했습니다
쓸대없이 Destroy,DeleteDC 한거랑 Destroy 위치 등등 다시 지우고 고치니까 되네요 이거하느라 오늘 반나절 보냈네요 ㅠㅠ
댓글 달기