我正在尝试使用以下代码
使用字节数组动态创建位图图像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()的调用者以释放内存。
答案 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方法获取输入缓冲区地址?