2015-05-11 4 views
5

Ich habe eine WPF-Anwendung, die ein Snapshot-Bild aus einer Videodatei erstellt. Der Benutzer kann den Zeitstempel definieren, ab dem das Bild aufgenommen werden soll. Das Bild wird dann an einem temporären Speicherort auf der Festplatte gespeichert und dann in ein <image> Element gerendert.WPF Image Caching

Der Benutzer sollte dann in der Lage sein, einen anderen Zeitstempel auszuwählen, der dann die temporäre Datei auf der Festplatte überschreibt - diese sollte dann im Element <image> angezeigt werden.

Mit Image.Source = null;, kann ich klar die Bilddatei aus dem <image> Elemente, so zeigt es ein Leerzeichen statt. Wenn die Quellbilddatei dann jedoch mit einem neuen Bild (mit demselben Namen) überschrieben und in das Element <image> geladen wird, zeigt es immer noch das alte Bild.

Ich verwende die folgende Logik:

// Overwrite temporary file file here 

// Clear out the reference to the temporary image 
Image_Preview.Source = null; 

// Load in new image (same source file name) 
Image = new BitmapImage(); 
Image.BeginInit(); 
Image.CacheOption = BitmapCacheOption.OnLoad; 
Image.UriSource = new Uri(file); 
Image.EndInit(); 
Image_Preview.Source = Image; 

Das Bild im nicht <image> Elemente angezeigt nicht ändern, auch wenn die ursprüngliche Datei vollständig ersetzt. Gibt es hier ein Bild-Caching-Problem, das mir nicht bekannt ist?

Antwort

9

Standardmäßig zwischenspeichert WPF BitmapImages, die von URIs geladen werden.

Sie können das vermeiden, indem die BitmapCreateOptions.IgnoreImageCache Flags:

var image = new BitmapImage(); 

image.BeginInit(); 
image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
image.CacheOption = BitmapCacheOption.OnLoad; 
image.UriSource = new Uri(file); 
image.EndInit(); 

Image_Preview.Source = image; 

Oder Sie die Bitmap laden direkt aus einem Stream:

var image = new BitmapImage(); 

using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read)) 
{ 
    image.BeginInit(); 
    image.CacheOption = BitmapCacheOption.OnLoad; 
    image.StreamSource = stream; 
    image.EndInit(); 
} 

Image_Preview.Source = image; 
+0

Danke, werde ich das mal ausprobieren :) –

+0

That hat perfekt funktioniert. Ich werde ab jetzt 'FileStream' verwenden, wenn ich das Caching vermeiden möchte. Vielen Dank. –

+0

Ich hatte mit demselben Problem zu kämpfen. Danke! – Misiu