Question

Je travaille sur une application WPF qui a plusieurs toiles et beaucoup de boutons. Les images de charge cand utilisateur pour changer l'arrière-plan du bouton.

Ceci est le code où je charge l'image de 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) est l'ajout

bmp.DecodePixelWidth = 1024;

1024 - ma taille de toile maximale. Mais je dois faire ce que les images avec une plus grande largeur de 1024 - alors comment puis-je obtenir la largeur avant EndInit ()

?
Était-ce utile?

La solution

En chargeant l'image en une BitmapFrame Je pense que vous allez vous en tirer avec la simple lecture des 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;

J'ai testé à quelques reprises et regarda la consommation de mémoire dans le Gestionnaire des tâches et la différence était énorme (sur une photo 10MP, je sauvé presque 40 Mo de mémoire privée en le chargeant @ 1024 au lieu de 4272 pixels largeur)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top