Проблема памяти WPF BitmapImage - PullRequest
       25

Проблема памяти WPF BitmapImage

3 голосов
/ 29 сентября 2010

Я работаю над приложением WPF с несколькими холстами и множеством кнопок.Пользователь Cand загружает изображения для изменения фона кнопки.

Это код, в который я загружаю изображение в объект 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 Ответ

5 голосов
/ 29 сентября 2010

Загружая изображение в 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;

Я протестировал это несколько раз и посмотрел на потребление памяти в диспетчере задач, и разница была огромной (на 10-мегапиксельной фотографии я сэкономил почти 40 МБ личной памяти, загрузив ее с разрешением 1024 вместо ширины 4272 пикселя)

...