使用时为什么会出现内存不足错误?

时间:2013-01-21 13:18:35

标签: c# using memorystream

我有以下方法将BitmapImage转换为System.Drawing.Bitmap

public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
    Bitmap bitmap;

    using (var ms = new MemoryStream())
    {
        var encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
        encoder.Save(ms);

        bitmap = new Bitmap(ms);
    }

    return bitmap;
}

每当我尝试使用返回的Bitmap对象时,都会收到以下错误:

  

发生OutOfMemoryException - 内存不足。

但是,每当我用以下代码替换代码时:

public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
    var ms = new MemoryStream();

    var encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmapImage));

    encoder.Save(ms);

    return new Bitmap(ms);
}

这很好用。但是,我很确定我应该使用使用,因为MemoryStream对象实现了IDisposable。这是怎么回事?

2 个答案:

答案 0 :(得分:11)

Bitmap的构造函数Bitmap Constructor (Stream)声称

  

您必须在Bitmap的生命周期内保持流打开。

在您的情况下,当您使用using语句时,流(正在使用Disposable)会自动处理,因此您的Bitmap对象将变为无效。这不是你分配太多内存,而是关于那个位图指向不再存在的东西。

答案 1 :(得分:1)

@Tigran 表示绝对正确,我实施了 @CodesInChaos '解决方法:

public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
    Bitmap bitmap;

    using (var ms = new MemoryStream())
    {
        var encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
        encoder.Save(ms);

        using (var localBitmap = new Bitmap(ms))
        {
            bitmap = localBitmap.Clone(new Rectangle(0, 0, localBitmap.Width, localBitmap.Height),
                   PixelFormat.Format32bppArgb);  
        }
    }

    return bitmap;
}
相关问题