2011-06-21 23 views
13

que utilizo:BitmapImage en WPF hace fichero de bloqueo

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

esto no Use OnLoad hace y archivo todavía está bloqueado para sobrescribir en el disco duro. ¿Alguna idea de cómo desbloquear?

Saludos

+0

También hay problemas de memoria para echar un vistazo. Ver http://stackoverflow.com/questions/6271891/net-memory-issues-loading-40-images-memory-not-reclaimed-potentially-due-to-l/6271982#6271982 – Oppositional

+0

Gracias. ¿Quieres que diga, para no intentar almacenar en caché todo el archivo si no es realmente posible con tu enlace? – Nasenbaer

Respuesta

30

Como se muestra en la pregunta se vincula a, que había necesidad de llamar BeginInit y EndInit, como tal, así como establecer la propiedad UriSource:

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

Gracias por su rápida respuesta también con respecto a mis palabras clave y VB en lugar de C#! Funciona muy bien ahora! – Nasenbaer

+0

¿Hay alguna manera de hacer esto estrictamente con XAML? – TrustyCoder

7

Leer el archivo de BitmapImage y volver a escribir con un 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

Gracias Navid por tu respuesta rápida. Veo que funcionará de esa manera por lo que veo. Estoy usando 'bmi.EndInit()' methode + 'OnLoad ' ahora que es un poco más simple en mi caso. – Nasenbaer

+0

Ahora, ¿a quién pertenece la instancia del objeto MemoryStream y es responsable de eliminarlo? – Henrik

+1

De todos modos ... ¿Cómo desbloquear el archivo y eliminarlo? –

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

que tenía como problema imilar y he resuelto usando este método: (es una personalización de una respuesta here)

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

Puede abrir la imagen como esta:

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

y libera la imagen inmediatamente después de cargarlo .

Espero que pueda ayudar!

Cuestiones relacionadas