WPF Bitmapspeicher Problem
-
26-09-2019 - |
Frage
Ich arbeite an einer WPF-Anwendung, die mehrere Leinwände und viele Tasten hat. Die Benutzer cand Bilder laden auf die Schaltfläche Hintergrund ändern.
Dies ist der Code, wo ich das Bild im Bitmap Objekt laden
bmp = new BitmapImage();
bmp.BeginInit();
bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.UriSource = new Uri(relativeUri, UriKind.Relative);
bmp.EndInit();
und auf EndInit () -Anwendung Speicher wächst sehr.
Eine Sache, die macht denkt besser (aber nicht behebt das Problem wirklich) ist das Hinzufügen
bmp.DecodePixelWidth = 1024;
1024 - meine maximale Leinwandgröße. Aber ich soll dies tun, nur auf die Bilder mit einer Breite von mehr als 1024 - so wie kann ich die Breite vor EndInit get ()
?Lösung
Durch das Laden des Bildes in eine Bitmapframe ich glaube, Sie mit bekommen nur um die Metadaten zu lesen.
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);
}
Und dann können Sie folgendes tun, wenn das Laden der 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;
testete ich das ein paar Mal und am Speicherverbrauch im Task-Manager sehe und der Unterschied war riesig (auf einem 10-MP-Foto, ich sparte fast 40 MB eigenen Speichers durch Laden @ 1024 anstelle von 4272 Pixel Breite)