0

次のような問題があります: 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(...); でデバッグ アサーションが失敗します)。そうしないとメモリリークが発生するので、やりたいと思います。

そのため、一般的に、オブジェクトのコピーについて私が知らないことがあります。

編集:

他のスレッドは、次の方法で 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();
}
4

1 に答える 1