我遇到了一个类似于这个问题的问题:How to copy a CImage object?,我需要对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();
}发布于 2014-10-15 12:20:08
最后我想出了这里出了什么问题!
问题是,在辅助线程中,我将CImage对象返回到另一个CImage对象(该对象保存在堆栈上):
CImage wyniczek;
objekt->ApplyTransform(macierz,&wyniczek);然后使用复制构造函数将其复制到堆上构造的新对象:
CImage *doprzeslania;
doprzeslania=new CImage(wyniczek);因此,一般来说,*doprzeslania对象只有在二级线程运行时才有效,这导致了奇怪的行为,在接收PostMessage的函数开始时,我能够正确地保存它,但是无法将它复制到另一个对象。解决方案是将图像直接从函数中输入*doprzeslania对象:
CImage *doprzeslania;
doprzeslania=new CImage();
objekt->ApplyTransform(macierz,doprzeslania);现在我对在屏幕上显示这个图像有问题,但在我提出另一个问题之前,我必须自己更仔细地研究它。谢谢大家的支持!
https://stackoverflow.com/questions/26259295
复制相似问题