我正在尝试使用以下代码使用字节数组动态创建位图图像
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() 的调用者来释放内存。
最简单的方法可能是创建位图(尽管在类似的代码我用过普通的byte[]
然后一个fixed
阻止,而不是直接使用AllocCoTaskMem
),然后创建一个second Bitmap
大小相同。称呼Graphics.FromImage
在第二个位图上,然后Graphics.DrawImage
使用first位图有效地将第一个位图的内容复制到第二个位图上。然后你可以打电话Dispose
在第一个位图上,释放内存,并使用第二个位图,它基本上是一个副本。
如果您更精通图像内容,很可能有一种更有效的方法来做到这一点,但如果您只是在寻找一种让它发挥作用的方法,那么这是一个起点:)
编辑:zachrrs 的评论确实使使用更容易位图(图像)构造函数:
using (Bitmap original = new Bitmap(...))
{
Bitmap copy = new Bitmap(originalImage);
// Then return "copy" from your method, and you can free the
// memory
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)