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 ()

?
War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top