2015-05-11 9 views
5

Mam aplikację WPF, która pobiera migawkę z pliku wideo. Użytkownik może zdefiniować znacznik czasu, z którego ma zostać pobrany obraz. Obraz jest następnie zapisywany w tymczasowej lokalizacji na dysku, a następnie renderowany do elementu <image>.Buforowanie obrazów WPF

Użytkownik powinien wtedy mieć możliwość wybrania innego znacznika czasu, który następnie zastąpi plik tymczasowy na dysku - powinno to być wyświetlone w elemencie <image>.

Korzystanie Image.Source = null;, mogę jasne plik obrazu z elementu <image>, więc wyświetla spację zamiast. Jeśli jednak plik obrazu źródłowego zostanie nadpisany nowym obrazem (o tej samej nazwie) i załadowany do elementu , nadal będzie wyświetlany stary obraz.

używam następującą 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; 

Obraz wyświetlany w elemencie <image> nie zmienia, mimo że oryginalny plik został całkowicie zastąpiony. Czy jest tu problem z buforowaniem obrazu, o którym nie wiem?

Odpowiedz

9

Domyślnie, WPF buforuje BitmapImages, które są ładowane z URI.

Można tego uniknąć poprzez ustawienie BitmapCreateOptions.IgnoreImageCache flag

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; 

Albo załadować BitmapImage bezpośrednio ze strumienia:

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

Dzięki, dam tego spróbować :) To –

+0

działało idealnie. Użyję 'FileStream's od teraz, gdy chcę uniknąć buforowania. Dzięki. –

+0

Walczyłem z tym samym problemem. Dziękuję Ci! – Misiu

Powiązane problemy