Si potrebbe usare a MemoryStream
ma che in realtà spreca memoria perché due copie separate dei dati bitmap sono conservate nella RAM: quando si carica il MemoryStream
si effettua una copia e quando la bitmap viene decodificata viene creata un'altra copia. Un altro problema con l'utilizzo di MemoryStream
in questo modo è che si ignora la cache.
Il modo migliore per farlo è quello di leggere direttamente dal file utilizzando BitmapCacheOptions.OnLoad:
path = @"c:\somePath\somePic.jpg"
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
source.CacheOption = BitmapCacheOption.OnLoad;
source.EndInit(); // Required for full initialization to complete at this time
var img = new System.Windows.Controls.Image { Source = source };
Questa soluzione è efficiente e semplice troppo.
Nota: se si desidera ignorare la cache, ad esempio perché l'immagine potrebbe cambiare sul disco, è necessario impostare anche CreateOption = BitmapCreateOption.IgnoreImageCache
. Ma anche in questo caso questa soluzione supera la soluzione MemoryStream
perché non conserva due copie dei dati dell'immagine nella RAM.
fonte
2010-03-11 10:27:23
Tx, funziona. Per i lettori successivi: l'ho copiato in un memorandtream come questo: MemoryStream byteStream = new MemoryStream (File.ReadAllBytes (path)); – Peter
Sì, funziona **, ma è inefficiente ** perché: 1. Due copie dei dati dell'immagine vengono conservate per sempre e 2. La cache viene ignorata in modo che l'immagine venga caricata anche se è già nella RAM. L'articolo collegato spiega una soluzione alternativa per il # 1 ma richiede molto codice extra e comunque non risolve il # 2. Una soluzione molto migliore è 'BitmapCacheOption.OnLoad' combinato con' BeginInit/EndInit'. –
Non puoi semplicemente chiudere il flusso di memoria dopo l'EndInit'? Perché dovresti tenere entrambi? – Jordan