2010-09-29 6 views
3

Я работаю над WPF-приложением с несколькими холстами и множеством кнопок. Пользовательские загрузки загружают изображения, чтобы изменить фон кнопки.WPF BitmapImage Memory Problem

Это код, где я загрузить изображение в объекте 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()?

ответ

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, я сохранил почти 40 МБ частной памяти, загрузив ее @ 1024 вместо ширины 4272 пикселей)

+0

Ничего себе, это действительно впечатляет, какая разница для меня - не только в использовании памяти, но и в производительности. Спасибо за просто простой и понятный ответ - для браузера файлов галереи фотографий это только решило ряд проблем, которые у меня были! – tpartee