2014-10-08 67 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); 

现在我有在屏幕上显示此图像的问题,但是我会问一个问题之前,我将不得不考虑它靠近我自己。感谢大家的支持!