在我的情况下,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* 的情况下正确地做到这一点。