我使用以下方法将byte[]
转换为Bitmap
:
public static Bitmap ByteArrayToBitmap(byte[] byteArray)
{
int width = 2144;
int height = 3;
Bitmap bitmapImage = new Bitmap(width, height, PixelFormat.Format32bppPArgb);
BitmapData bmpData = bitmapImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
IntPtr ptr = bmpData.Scan0;
try
{
Marshal.Copy(byteArray, 0, ptr, byteArray.Length);
bitmapImage.UnlockBits(bmpData);
return bitmapImage;
}
finally
{
//Marshal.FreeHGlobal(ptr); //Do I need this?
}
}
只是想知道我是否需要释放任何资源?
尝试调用Marshal.FreeHGlobal(ptr)
,但我收到此错误:
对内存位置的无效访问。
有人可以指导吗?
此外,仅供参考,我可以使用MemoryStream
从Bitmap
中获取byte[]
,但在这种情况下我获得了“参数无效”异常。这就是为什么选择路线Marshal
。
答案 0 :(得分:4)
使用AllocHGlobal时,只能使用FreeHGlobal。你没有这么称呼它。您确实分配了非托管内存,它由new Bitmap
完成。这是由Dispose()或GC发布的。后来。
你当然应该使用finally块,这就是你调用UnlockBits()的地方。那'释放'指针。
答案 1 :(得分:2)
不,你不需要。
为位图分配的内存由Bitmap构造函数分配,当bitmapImage被释放时,它将被释放。
答案 2 :(得分:1)
您唯一应该做的就是确保在退回的Bitmap
上调用dispose。最好的方法是将其置于using
块内。
using(Bitmap myBitmap = ByteArrayToBitmap(someArray)
{
//...
}