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:
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 ();