WPF BitmapImage内存问题

时间:2010-09-29 08:04:12

标签: wpf memory bitmapimage

我在WPF应用程序上工作,该应用程序有多个画布和许多按钮。用户可以加载图像以更改按钮背景。

这是我在BitmapImage对象中加载图像的代码

bmp = new BitmapImage();
bmp.BeginInit();
bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.UriSource = new Uri(relativeUri, UriKind.Relative);
bmp.EndInit();

并且在EndInit()应用程序的内存增长非常多。

使思考更好(但并未真正解决问题)的一件事是添加

bmp.DecodePixelWidth = 1024;

1024 - 我的最大画布尺寸。但我应该只对宽度大于1024的图像执行此操作 - 那么如何在EndInit()之前获得宽度?

1 个答案:

答案 0 :(得分:5)

通过将图片加载到BitmapFrame我认为只需阅读元数据就可以了。

private Size GetImageSize(Uri image)
{
    var frame = BitmapFrame.Create(image);
    // You could also look at the .Width and .Height of the frame which 
    // is in 1/96th's of an inch instead of pixels
    return new Size(frame.PixelWidth, frame.PixelHeight);
}

然后在加载BitmapSource时可以执行以下操作:

var img = new Uri(ImagePath);
var size = GetImageSize(img);
var source = new BitmapImage();
source.BeginInit();
if (size.Width > 1024)
    source.DecodePixelWidth = 1024;
source.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
source.CacheOption = BitmapCacheOption.OnLoad;
source.UriSource = new Uri(ImagePath);
source.EndInit();
myImageControl.Source = source;

我测试了几次并查看了任务管理器中的内存消耗,差异很大(在10MP的照片上,通过加载@ 1024而不是4272像素宽度,我节省了近40MB的私有内存)