在C ++ / CLI中创建和使用System.Drawing.Bitmap

时间:2013-02-19 19:24:08

标签: c# c++-cli gdi+

我正在尝试在C ++ / CLI中完成以下操作。

我有一个构建图像内容的本地类(位图):

unsigned char* NativeClass:GetBitmapBits(void)

我想使用此数据来创建托管的System.Drawing.Bitmap。我的第一个想法是使用构造函数:

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

我有点工作,但现在遇到的问题是,稍后使用此Bitmap会导致System.Drawing中的第一次机会异常System.AccessViolationException。我怀疑问题是我没有正确管理非托管位图位(由本机方法返回)转换为将其传递到托管位图构造函数。

我应该如何从第一个函数中获取本机指针并准备它(例如,我是否需要使用interior_ptr或pin_ptr?)并将其传递给期望IntPtr的Bitmap构造函数?

编辑:详细说明,这是我天真的尝试:

virtual void OnPaint(PaintEventargs^ e) override
{
...
   unsigned char* bits = nativeClassObj->getBitmapBits();

   gcnew Bitmap(width, height, stride, PixelFormat::Format24bppRgb, (IntPtr)bits);

   e->Graphics->DrawImage((System::Drawing::Image^)managedBitmap,0,0);
...
}

..和结果(我在绘图窗口中得到'红色X'):

A first chance exception of type 'System.AccessViolationException' occurred in System.Drawing.dll

0 个答案:

没有答案