我正在使用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;
}
答案 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