绑定图像时,wpf应用程序内存增加

时间:2015-02-17 15:17:47

标签: wpf

如何在wpf应用程序中加载图像时缩小图像大小。

这是我上传图片的代码

if (ofg.FileName != null && ofg.FileName.Length > 0)
            {
                ofg.OpenFile();
                FileStream fs1 = new FileStream(ofg.FileName, FileMode.Open, FileAccess.Read);
                Byte[] imgByteArr = new byte[fs1.Length];
                fs1.Read(imgByteArr, 0, Convert.ToInt32(fs1.Length));
                fs1.Close();
                BitmapImage biImg = new BitmapImage();
                MemoryStream ms = new MemoryStream(imgByteArr);
                biImg.BeginInit();
                biImg.StreamSource = ms;
                RenderOptions.SetBitmapScalingMode(biImg, BitmapScalingMode.LowQuality);
                biImg.EndInit();
                UserImage = biImg as ImageSource;
            }

Plz帮助我缩小图像尺寸...

1 个答案:

答案 0 :(得分:2)

如果没有将返回值分配给稍后关闭的Stream变量,请不要调用OpenFile。否则,Stream永远不会关闭,从而产生内存泄漏。当您打开FileStream时,根本不需要调用OpenFile。

您可以通过避开MemoryStream并冻结BitmapImage来进一步减少内存消耗。

var biImg = new BitmapImage();
using (var fs = new FileStream(ofg.FileName, FileMode.Open, FileAccess.Read))
{
    biImg.BeginInit();
    biImg.CacheOption = BitmapCacheOption.OnLoad;
    biImg.StreamSource = fs;
    biImg.EndInit();
}
biImg.Freeze();
UserImage = biImg;

如果您还需要减少像素数,可以设置DecodePixelWidth或DecodePixelHeight(但如果要保留宽高比,则不能同时设置两者):

biImg.BeginInit();
biImg.CacheOption = BitmapCacheOption.OnLoad;
biImg.StreamSource = fs;
biImg.DecodePixelWidth = 200;
biImg.EndInit();