Проблема с памятью WPF 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 ()?


person morsanu    schedule 29.09.2010    source источник


Ответы (1)


Загрузив изображение в 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 пикселей)

person Isak Savo    schedule 29.09.2010
comment
Вау, это действительно впечатляет, какая разница для меня - не только в использовании памяти, но и в производительности. Спасибо за удивительно простой и понятный ответ - для браузера файлов фотогалереи только это решило ряд моих проблем! - person tpartee; 24.06.2016