Utilizzo di BitmapFrame per i metadati senza bloccare il file

Ho trovato il modo comune per ottenere metadati di immagini in WPF è quello di creare un object BitmapFrame e ispezionare la proprietà dei metadati su di esso. Tuttavia non riesco a creare un object BitmapFrame che soddisfi questi due requisiti:

  1. Non blocca il file
  2. Non genera eccezioni strane e non documentate quando vengono forniti determinati file

L’utilizzo di queste linee sembra creare BitmapImage modo affidabile:

 BitmapFrame.Create(new Uri(imageName)); BitmapFrame.Create(new Uri(imageName), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None); 

Tuttavia lasciano il file bloccato per un periodo di tempo indeterminato. Non c’è alcun metodo di smaltimento su BitmapFrame per quanto posso dire.

Ciò impedisce al file di essere bloccato:

 BitmapFrame.Create(new Uri(imageName), BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 

Tuttavia su Vista getta ArgumentException InvalidOperationException su determinati file e su Win7 getta FileFormatException s e IOException s. Questo mi fa pensare che il caching di BitmapFrame non sia supportato / non testato.

È ansible ottenere i metadati da un’immagine in WPF senza lasciare un blocco sul file per un periodo di tempo indeterminato?

Hai provato a utilizzare un approccio al convertitore? Ad esempio, la mia applicazione Intuipic fa questo. Vedi BitmapFrameConverter per i dettagli sul caricamento senza blocco e BitmapOrientationConverter per ottenere i metadati.

Non so se una risposta in questo momento possa ancora essere utile a nessuno, ma dato che sono arrivato qui solo oggi, presumo che qualcun altro possa essere interessato.

Ho avuto un problema simile durante il tentativo di utilizzare BitmapFrame per verificare se un’immagine è valida, quindi provare a rinominare il file immagine. Con questo codice, l’immagine è bloccata e il comando Sposta non funziona:

 bool isImageValid = true; try { BitmapFrame bmpFrame = BitmapFrame.Create(new Uri("C:\\Images\\Test.jpg")); } catch { isImageValid = false; } File.Move("C:\\Images\\Test.jpg", "C:\\Images\\Test0.jpg"); 

Tuttavia, quando leggo per la prima volta il file immagine in un stream di file, il file viene rilasciato non appena viene utilizzato il blocco using e il comando Move funziona:

 bool isImageValid = true; try { using (FileStream fs = new FileStream("C:\\Images\\Test.jpg", FileMode.Open)) { BitmapFrame bmpFrame = BitmapFrame.Create(fs); } } catch { isImageValid = false; } File.Move("C:\\Images\\Test.jpg", "C:\\Images\\Test0.jpg"); 

Prova bitmapImage.StreamSource.Dispose () o bitmapImage.Freeze ();