0

在我的情况下,Drawing::Bitmap 是使用指向像素数据的指针创建的。在 MSDN 上,您可以找到执行此操作的构造函数:

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

从文档中可以清楚地看出,此构造函数仅围绕所提供的数据创建标头和所需内容。还需要注意的是,调用者必须释放像素数据数组。

调用者负责分配和释放由 scan0 参数指定的内存块。但是,在释放相关的 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放入一个管理它们的类中。类的析构函数将负责销毁然后ManagedImg调用. 然后你的函数可以返回一个指向这个包装类的指针,而不是.cvReleaseImage()IplImage*GetImageDrawing::Image

于 2013-09-08T08:53:27.977 回答