WPF BitmapImage内存使用情况

时间:2011-05-26 18:17:27

标签: wpf memory bitmapimage

我正在尝试将图像的字节数组转换为BitmapImage以绑定到按钮。

public static BitmapImage GetBitmapImageFromByteArray(byte[] p_Image)
    {
        try
        {
            BitmapImage bmpImage;
            if (p_Image != null)
            {
                using (MemoryStream msStream = new MemoryStream(p_Image))
                {
                    msStream.Position = 0;
                    bmpImage = GetBitmapImageFromStream(msStream);
                    //msStream.Close();
                    return bmpImage;
                }
            }
        }
        catch
        {
        }
        return null;
    }

GetBitmapImageFromStream看起来像这样:

public static BitmapImage GetBitmapImageFromStream(MemoryStream msImage)
    {
        try
        {
            if (msImage == null) return null;
                BitmapImage bmpImg = new BitmapImage();
                msImage.Position = 0;
                bmpImg.BeginInit();
                bmpImg.CacheOption = BitmapCacheOption.OnLoad;
                bmpImg.StreamSource = msImage;
                bmpImg.EndInit();
                return bmpImg;

        }
        catch
        {
            return null;
        }
    }

在bmpImg.EndInit()上,内存中存在巨大的峰值。我的界面上有很多按钮导致问题。为什么会这样,我该如何修复或如何恢复内存?

感谢。

2 个答案:

答案 0 :(得分:1)

help我的猜测是它创建了一个副本来缓存它,而可能一个副本按比例缩小以在按钮上使用它。虽然GC没有收集复制到流中的所有数据,但内存中会有多个副本。

答案 1 :(得分:0)

尝试限制图像高度。您可以将DecodePixelHeight属性设置为BitmapImage。 转换字节需要一些时间,但最大高度将受到限制,内存使用量将减少。

                var bmpImg = new BitmapImage();
                msImage.Position = 0;
                bmpImg.BeginInit();

                 bmpImg.DecodePixelHeight =containerHeight; 

                bmpImg.CacheOption = BitmapCacheOption.OnLoad;
                bmpImg.StreamSource = msImage;
                bmpImg.EndInit();
                return bmpImg;

P.S。也许你会在那里发生内存泄漏。 http://code.logos.com/blog/2008/04/memory_leak_with_bitmapimage_and_memorystream.html