C#:使用字节数组创建位图

C#:使用字节数组创建位图,c#,.net,image,C#,.net,Image,我正在尝试使用以下代码使用字节数组动态创建位图图像 Bitmap GetImage() { IntPtr ip = Marshal.AllocCoTaskMem(imagesize); //some code to fill ip Image img = new Bitmap( w, h, -stride,

我正在尝试使用以下代码使用字节数组动态创建位图图像

Bitmap GetImage()
{
    IntPtr  ip = Marshal.AllocCoTaskMem(imagesize);

    //some code to fill ip

    Image img =  new Bitmap(
                    w,
                    h,
                    -stride,
                    PixelFormat.Format24bppRgb,
                    (IntPtr)(ip.ToInt32() + imagesize - stride)
                    );

    Marshal.FreeCoTaskMem( ip); // Comment this line to work

    return img;
}

void SaveImage()
{
    Image img =  GetImage();
    img.save("test.bmp"); // This call fails
    img.Dispose();
}
现在我的问题是我想返回位图,但同时我不想保留ip指针,因为分配的内存泄漏。它永远不会被释放。
如何返回使用字节数组创建的图像,而不打扰函数GetImage()的调用者以释放内存。

最简单的方法可能是创建位图(尽管在本例中,我使用了普通的
字节[]
固定的
块,而不是直接使用
AllocTaskMem
),然后创建第二个大小相同的
位图。在第二个位图上调用
Graphics.FromImage
,然后使用第一个位图将第一个位图的内容有效地复制到第二个位图上。然后可以对第一个位图调用
Dispose
,释放内存,然后使用第二个位图,它基本上是一个副本

如果你更精通图像方面的东西,可能会有一种更有效的方法,但如果你只是想找到一种方法让它发挥作用,这是一个起点:)

编辑:zachrrs的评论确实使使用构造函数变得更容易:

using (Bitmap original = new Bitmap(...))
{
    Bitmap copy = new Bitmap(originalImage);
    // Then return "copy" from your method, and you can free the
    // memory
}

如果您事先知道尺寸,为什么不创建位图并使用该方法获取输入缓冲区地址?

我从非托管缓冲区获取数据,该缓冲区只不过是DirectX SampleGrabber过滤器,这就是我使用AllocTaskMemfair的原因:)希望这对您有用。如果您需要更完整的示例,请告诉我。您不需要创建中间图形对象,只需使用构造函数中的原始位图实例创建一个新的位图实例。是的,它起到了作用。谢谢我试过了。Clone()但没用。你能解释一下原因吗?