私の状況では、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* を渡さずに適切に行う方法を本当に知りたいです。