4

我正在尝试将图像的字节数组转换为 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() 上,内存中有一个巨大的峰值。而且我的界面上有很多按钮,这导致了问题。为什么会发生这种情况,我该如何修复它或如何恢复内存?

谢谢。

4

2 回答 2

1

帮助我的猜测是它创建了一个副本来缓存它,也许一个副本缩小以在按钮上使用它。虽然GC不会收集复制到流中的所有数据,但内存中会有多个副本。

于 2011-05-26T19:35:38.730 回答
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;

Ps 也许你那里会有内存泄漏。 http://code.logos.com/blog/2008/04/memory_leak_with_bitmapimage_and_memorystream.html

于 2013-10-23T22:17:25.657 回答