WPF:MemoryStream占用大量内存

时间:2018-07-20 14:27:54

标签: c# wpf xaml

我正在使用MemoryStram将Bitmap转换为BitmapImage,当我检查CPU使用率时,它正在消耗更多的内存。我想减少MemoryStream对象的内存消耗。我也在Using语句中使用了它,结果与前面提到的相同。 我在打我的代码片段,任何人都可以帮助我找到解决方案或任何其他可用的替代方法。 代码:

public static BitmapImage ConvertBitmapImage(this Bitmap bitmap)
{
    using (MemoryStream ms = new MemoryStream())
    {
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        System.Windows.Media.Imaging.BitmapImage bImg = new System.Windows.Media.Imaging.BitmapImage();
        bImg.BeginInit();
        bImg.StreamSource = new MemoryStream(ms.ToArray());
        bImg.EndInit();
        return bImg;
    }
}

public static BitmapImage ConvertBitmapImage(this Bitmap bitmap)
{
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            MemoryStream ms = new MemoryStream();
            bitmap.Save(ms, ImageFormat.Bmp);
            ms.Seek(0, SeekOrigin.Begin);
            bi.StreamSource = ms;
            bi.EndInit();
            return bi;
}

1 个答案:

答案 0 :(得分:3)

不需要第二个MemoryStream。

在解码BitmapImage之前,只需倒回已编码的位图,然后设置BitmapCacheOption.OnLoad以确保可以在EndInit()之后关闭流:

public static BitmapImage ConvertBitmapImage(this System.Drawing.Bitmap bitmap)
{
    var bImg = new BitmapImage();

    using (var ms = new MemoryStream())
    {
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        ms.Position = 0; // here, alternatively use ms.Seek(0, SeekOrigin.Begin);

        bImg.BeginInit();
        bImg.CacheOption = BitmapCacheOption.OnLoad; // and here
        bImg.StreamSource = ms;
        bImg.EndInit();
    }

    return bImg;
}

请注意,还有其他在Bitmap和BitmapImage之间进行转换的方法,例如这个:fast converting Bitmap to BitmapSource wpf