0

私の状況では、Drawing::Bitmap はピクセル データへのポインターを使用して作成されます。MSDN では、まさにこれを行うコンストラクターを見つけることができます。

Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0);

ドキュメントから、このコンストラクターが提供されたデータの周りにヘッダーと必要なものだけを作成することは明らかです。また、呼び出し元がピクセル データ配列を解放する必要があることにも注意してください。

呼び出し元は、scan0 パラメータで指定されたメモリ ブロックの割り当てと解放を担当します。ただし、関連する Bitmap が解放されるまで、メモリを解放しないでください。

私の問題は、リンクされたピクセル データを含む Bitmap を別のクラスに渡すと、基になるデータを解放できないことです。以下の私の例を参照してください。

Drawing::Image^ FirstClass::GetImage(std::string ImagePath)
{
    IplImage* cvImg = cvLoadImage(ImagePath.c_str());
    Drawing::Image^ ManagedImg = gcnew Bitmap(
            cvImg->width, 
            cvImg->height, 
            cvImg->widthStep, 
            Drawing::Imaging::PixelFormat::Format24bppRgb, 
            (System::IntPtr)cvImg->imageData);
    return ManagedImg;
}


Void SecondClass::RefreshImage()
{
    // Release the last image first
    if (MyImage!=nullptr)
    {
        ???
    }

    MyImage = GetImage(...);
}

簡単な回避策は、IplImage * をSecondClassに渡し、そこでマネージビットマップを作成してから、 cvReleaseImage(&Native_MyImage); を呼び出すことです。そこの。ただし、これは機能しますが、IplImage* を渡さずに適切に行う方法を本当に知りたいです。

4

1 に答える 1

1

何らかの方法でポインターをピクセルに渡す必要があります。

私にとって、より良い方法は、両方を管理する単一のクラスIplImage*にラップすることです。クラスのManagedImgデストラクタは、. そして、関数は ではなく、このラッパー クラスへのポインターを返す可能性があります。ManagedImgcvReleaseImage()IplImage*GetImageDrawing::Image

于 2013-09-08T08:53:27.977 に答える