2011-06-21 21 views
13

używam:BitmapImage w WPF robi File Lock

Dim bmi As New BitmapImage(New Uri(fiInfo.FullName, UriKind.Absolute)) 
bmi.CacheOption = BitmapCacheOption.OnLoad 

nie Use OnLoad robi i nadal jest zablokowany plik nadpisać na dysku. Masz pomysł, jak odblokować?

Pozdrowienia

+0

Istnieją również problemy z pamięcią, które należy wziąć pod uwagę. Zobacz http://stackoverflow.com/questions/6271891/net-memory-issues-loading-40-images-memory-not-reclaimed-potentially-due-to-l/6271982#6271982 – Oppositional

+0

Dzięki. Czy chcesz, żebym powiedział, aby nie próbować zapisywać w pamięci podręcznej wszystkich plików, jeśli nie jest to możliwe z twoim linkiem? – Nasenbaer

Odpowiedz

30

jak pokazano na pytania, które połączy się, że trzeba zadzwonić BeginInit i EndInit, jak tak dobrze jak ustawić właściwość UriSource:

Dim bmi As New BitmapImage() 
bmi.BeginInit() 
bmi.CacheOption = BitmapCacheOption.OnLoad 
bmi.UriSource = New Uri(fiInfo.FullName, UriKind.Absolute) 
bmi.EndInit() 
+0

Dziękuję za szybką odpowiedź również w odniesieniu do moich słów kluczowych i VB zamiast C#! Działa teraz świetnie! – Nasenbaer

+0

Czy istnieje sposób, aby to zrobić ściśle przy użyciu XAML. – TrustyCoder

7

Przeczytaj BitmapImage z pliku i przepisać go z MemoryStream:

MemoryStream ms = new MemoryStream(); 
BitmapImage bi = new BitmapImage(); 
byte[] bytArray = File.ReadAllBytes(@"test.jpg"); 
ms.Write(bytArray, 0, bytArray.Length);ms.Position = 0; 
bi.BeginInit(); 
bi.StreamSource = ms; 
bi.EndInit(); 
image.Source = bi; 
+0

Dziękuję Navid za szybką odpowiedź. Widzę, że to zadziała tak daleko, jak widzę. Używam 'bmi.EndInit()' methode + 'OnLoad ' teraz, który jest nieco prostszy w moim przypadku. – Nasenbaer

+0

Kto jest właścicielem instancji obiektu MemoryStream i czy jest odpowiedzialny za jej usunięcie? – Henrik

+1

W każdym razie ... Jak odblokować plik i go usunąć? –

0
BitmapFrame.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
2

miałem jako odobne problemu i rozwiązać przy użyciu tej metody: (to jest personalizacja odpowiedź here)

public static BitmapImage BitmapFromUri(Uri source) 
    { 
     var bitmap = new BitmapImage(); 
     bitmap.BeginInit(); 
     bitmap.UriSource = source; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 
     bitmap.EndInit(); 
     return bitmap; 
    } 

można otworzyć obraz tak:

BitmapImage bimg = BitmapFromUri(new Uri(some_URI)); 

I uwalnia obraz natychmiast po załadowaniu go .

Mam nadzieję, że to pomoże!