9

我有以下方法,将 a 转换BitmapImage为 a 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);
}

这工作正常。但是,我很确定我应该使用using作为MemoryStream对象 implements IDisposable。这里发生了什么?

4

2 回答 2

11

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

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

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

于 2013-01-21T13:21:19.367 回答
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;
}
于 2013-01-21T13:28:22.180 回答