2014-10-08 81 views
0

我有類似這樣的一個問題:How to copy a CImage object? 我需要做的CImage對象的深副本。具體的問題是,我得到一個的CImage *從輔助線程通過PostMessage的,並希望將其複製到的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->的GetDC()(但在其他方面有調試斷言上obrazek->的BitBlt(...)失敗),但我無法釋放obrazek的DC和/或刪除obrazek對象,我想這樣做,因爲我有內存泄漏,如果我不這樣做。

所以一般有件事我不知道複製的對象。

編輯:

其他線程處理的CImage以下列方式:

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(); 
} 
+1

你真的確定,當您收到消息的對象仍然存在。其他線程如何釋放此CImage? – xMRi 2014-10-09 08:50:01

+0

是的,我敢肯定 - 在被的CImage成功地保存到磁盤(obrazek->保存(_T(「mesydz.jpg」));),似乎是完全有效的圖像。關於其他線程的 我會修改問題並添加更多代碼。 – user3621602 2014-10-09 16:49:24

+0

或者可能存在另一種在類和線程之間交換圖像的方法? – user3621602 2014-10-10 18:39:10

回答

0

最後我想出了這裏出了什麼問題!

的問題是,在輔助線程我正在返回的CImage對象到另一個的CImage對象(將其保持在棧上):

CImage wyniczek; 
objekt->ApplyTransform(macierz,&wyniczek); 

,然後將其複製與複製構造到一個新的對象構造的在堆上:

CImage *doprzeslania; 
doprzeslania=new CImage(wyniczek); 

所以在一般情況下,* doprzeslania對象是有效的,只要作爲輔助線程運行,導致怪異的行爲,我是能夠正確地將其保存在函數的開頭正在接收PostMessage,bu t無法將其複製到另一個對象。 解決的辦法是直接從函數獲取圖像到* doprzeslania對象:

CImage *doprzeslania; 
doprzeslania=new CImage(); 
objekt->ApplyTransform(macierz,doprzeslania); 

現在我有在屏幕上顯示此圖像的問題,但是我會問一個問題之前,我將不得不考慮它靠近我自己。感謝大家的支持!