元帅 - 我需要释放任何资源吗?

时间:2014-02-02 18:05:06

标签: c# bitmap marshalling

我使用以下方法将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),但我收到此错误:

  

对内存位置的无效访问。

有人可以指导吗?

此外,仅供参考,我可以使用MemoryStreamBitmap中获取byte[],但在这种情况下我获得了“参数无效”异常。这就是为什么选择路线Marshal

3 个答案:

答案 0 :(得分:4)

使用AllocHGlobal时,只能使用FreeHGlobal。你没有这么称呼它。您确实分配了非托管内存,它由new Bitmap完成。这是由Dispose()或GC发布的。后来。

你当然应该使用finally块,这就是你调用UnlockBits()的地方。那'释放'指针。

答案 1 :(得分:2)

不,你不需要。

为位图分配的内存由Bitmap构造函数分配,当bitmapImage被释放时,它将被释放。

答案 2 :(得分:1)

您唯一应该做的就是确保在退回的Bitmap上调用dispose。最好的方法是将其置于using块内。

using(Bitmap myBitmap = ByteArrayToBitmap(someArray)
{
   //...
}