C#:使用bytes数组创建位图

时间:2009-05-03 20:08:15

标签: c# .net image

我正在尝试使用以下代码

使用字节数组动态创建位图图像
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();
}

现在我的问题是我想返回一个Bitmap,但同时我不想保持ip指针作为内存分配泄漏。它永远不会被释放。 如何返回使用bytes数组创建的Image,而不必打扰函数GetImage()的调用者以释放内存。

2 个答案:

答案 0 :(得分:4)

最简单的方法可能是创建位图(尽管在similar code中我使用了普通byte[]然后使用fixed块,而不是直接使用AllocCoTaskMem ),然后创建相同大小的第二 Bitmap。在第二个位图上调用Graphics.FromImage,然后使用第一个位图调用Graphics.DrawImage以有效地将第一个位图的内容复制到第二个位图上。然后,您可以在第一个位图上调用Dispose,释放内存,并使用基本上是副本的第二个位图。

如果你对图像资料更加熟练,可能会有一种更有效的方法,但如果你只是想找到一种方法让它发挥作用,那就是一个起点:)

编辑:zachrrs的评论确实使用Bitmap(Image)构造函数使事情变得更容易:

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

答案 1 :(得分:0)

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