我正在尝试将图像的字节数组转换为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()上,内存中存在巨大的峰值。我的界面上有很多按钮导致问题。为什么会这样,我该如何修复或如何恢复内存?
感谢。
答案 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