2010-09-29 10 views
3

Je travaille sur une application WPF qui a plusieurs toiles et beaucoup de boutons. L'utilisateur peut charger des images pour changer l'arrière-plan du bouton.WPF BitmapImage Problème de mémoire

C'est le code où je charge l'image dans l'objet BitmapImage

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

et EndInit() la mémoire de l'application se développe très bien.

Une chose qui fait ravise (mais ne pas vraiment résoudre le problème) ajoute

bmp.DecodePixelWidth = 1024; 

1024 - ma taille maximale de la toile. Mais je devrais le faire seulement pour les images avec une largeur supérieure à 1024 - alors comment puis-je obtenir la largeur avant EndInit()?

Répondre

5

En chargeant l'image dans un BitmapFrame je pense que vous vous en tirerez juste en lisant les métadonnées.

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); 
} 

Et vous pouvez faire ce qui suit lors du chargement du 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; 

Je l'ai testé à quelques reprises et regardé la consommation de mémoire dans le Gestionnaire des tâches et la différence était énorme (sur un Photo 10MP, j'ai économisé près de 40 Mo de mémoire privée en la chargeant @ 1024 au lieu de 4272 pixels de largeur)

+0

Wow, c'est vraiment impressionnant de voir quelle différence cela fait pour moi - pas seulement en mémoire mais aussi en performance. Merci pour une réponse incroyablement simple et claire - pour un navigateur de fichiers galerie de photos cela seul résolu un certain nombre de problèmes que j'avais! – tpartee