이 문제는 다음과 유사합니다. How to copy a CImage object? CImage 개체의 전체 복사본을 만들어야합니다. 특정 문제는 PostMessage를 통해 보조 스레드에서 CImage *를 가져 와서 다른 클래스의 특성 인 CImage 개체에 복사하려고합니다.CImage 개체의 전체 복사본으로 인해 디버그 어설 션이 실패했습니다.
내가 현재 다음 코드가 있습니다
LRESULT CMainFrame::TransApplied(UINT wParam,LONG lParam)
{
DEB("message recieved\n"); //this is debug message to output
CImage *obrazek=(CImage*)wParam;
int a;
CString t;
CImage tymczas;
obrazek->Save(_T("mesydz.jpg"));//checking if the image is valid
DEB("o1\n");
obrazek->GetDC();
PointerToViewClass->przetransformowany.Create(obrazek->GetWidth(),obrazek->GetHeight(),obrazek->GetBPP());
DEB("o2\n");
obrazek->BitBlt(PointerToViewClass->przetransformowany.GetDC(),0,0,SRCCOPY);
// obrazek->ReleaseDC();
DEB("o8\n");
PointerToViewClass->przetransformowany.ReleaseDC();
DEB("o6\n");
DEB("o7\n");
obrazek->ReleaseDC();
//delete obrazek;
return 0;
}
내가 obrazek-에 문제>의 GetDC()와 obrazek-> ReleaseDC()가있다 생각한다. Obrazek의 DC를 해제 할 수 없거나 obrazek 객체를 삭제할 수는 없지만 obrazek-> GetDC()를 사용하면 오류가 발생하지 않습니다 (그러나 obrazek-> BitBlt (...);에서 디버그 어설 션이 실패했습니다) 나는 그것을하고 싶지 않다면 나는 메모리 누출이 있기 때문에하고 싶다.
그래서 일반적으로 개체를 복사하는 것에 대해 알지 못하는 무언가가 있습니다.
EDIT :
CImage wyniczek;
CImage *doprzeslania;
objekt->ApplyTransform(macierz,&wyniczek);//object is an object of a class declared in dll
doprzeslania=new CImage(wyniczek);
PostMessage(data->parent,MY_WM_MESSAGE4,(WPARAM)doprzeslania,(LPARAM)3);
delete objekt;
FreeLibrary(hDLL);
delete data;//deleting an object with settings for the thread
return 0;
추가적으로, 이미지와 DLL에 무슨 일 : 마지막
void IProcess::ApplyTransform(std::vector<double> matrix,CImage *rezult)
{
//
//some image processing here
//
output.Create(dest.cols,dest.rows,24);
BITMAPINFO bmi; //it is initialized properly, had erased it for clarity
StretchDIBits(output.GetDC(),0,0,dest.cols,dest.rows,0,0,dest.cols,dest.rows,temp.data,&bmi,DIB_RGB_COLORS,SRCCOPY); //copy from opencv Mat object to CImage
rezult->Create(output.GetWidth(),output.GetHeight(),24);
output.BitBlt(rezult->GetDC(),0,0,SRCCOPY); //copy to CImage *rezult
output.ReleaseDC();
rezult->ReleaseDC();
}
메시지를받을 때 개체가 여전히 있는지 확인하십시오. 다른 스레드가이 CImage를 어떻게 해제합니까? – xMRi
네, 꽤 확신합니다 - CImage가 성공적으로 디스크에 저장됩니다 (obrazek-> Save (_T ("mesydz.jpg"));) 그리고 완전히 유효한 이미지 인 것 같습니다. 다른 스레드에 관한 질문을 수정하고 더 많은 코드를 추가합니다. – user3621602
또는 클래스와 스레드간에 이미지를 교환 할 수있는 대체 방법이 있습니까? – user3621602