2009-11-14 5 views
2

Je dois ouvrir toutes les images de l'image Tiff dans WPF en mémoire, puis supprimer la source. Et après cela, j'ai finalement besoin de rendre cette image (redimensionnée en fonction de la taille de la fenêtre). Ma solution est assez lente et je ne peux pas supprimer la source du fichier avant le premier besoin. Des meilleures pratiques?Charger immédiatement l'image dans la mémoire

Répondre

7

Utilisez CacheOption = BitmapCacheOption.OnLoad

Cette option peut être utilisée avec la propriété BitmapImage.CacheOption ou comme argument pour BitmapDecoder.Create() Si vous souhaitez accéder à plusieurs cadres une fois que les images sont chargées, vous devrez utiliser BitmapDecoder.Create. Dans les deux cas, le fichier sera chargé complètement et fermé.

Voir aussi ma réponse à this question

Mise à jour

Le code suivant fonctionne parfaitement pour le chargement dans toutes les trames d'une image et la suppression du fichier:

var decoder = BitmapDecoder.Create(new Uri(imageFileName), BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
List<BitmapFrame> images = decoder.Frames.ToList(); 
File.Delete(imageFileName); 

Vous pouvez également accès decoder.Frames après le fichier est supprimé, bien sûr.

Cette variante fonctionne également si vous préférez ouvrir le flux vous:

List<BitmapFrame> images; 
using(var stream = File.OpenRead(imageFileName)) 
{ 
    var decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
    images = decoder.Frames.ToList(); 
} 
File.Delete(imageFileName); 

Dans les deux cas, il est plus efficace que la création d'un MemoryStream parce qu'un MemoryStream conserve deux copies des données en mémoire à la fois: Le copie décodée et la copie non décodée.

+0

Merci, mais comment puis-je accéder à plusieurs cadres d'image objet BitmapImage? –

+1

Vous pouvez utiliser BitmapDecoder.Create(), alors vous pouvez obtenir tous les cadres. J'ai ajouté un paragraphe à ma réponse pour l'expliquer. –

+0

Je le fais actuellement, je ne sais pas comment puis-je convertir BitmapFrame en BitmapImage. Après que je copie tous les cadres à la liste je ne peux pas supprimer le fichier image. J'ai juste besoin de supprimer le fichier image juste après que toutes les images sont chargées en mémoire. –

0

Je l'ai compris. Je dois utiliser MemoryStream:

MemoryStream ms = new MemoryStream(File.ReadAllBytes(image)); 
TiffBitmapDecoder decoder = new TiffBitmapDecoder(ms, BitmapCreateOptions.None, BitmapCacheOption.None); 
List<BitmapFrame> images = new List<BitmapFrame>(); 
foreach (BitmapFrame frame in decoder.Frames) images.Add(frame); 
+2

Ceci est inefficace car il conserve deux copies du fichier en mémoire en même temps: le MemoryStream et les données dans les BitmapFrames. Ma réponse obtient le même résultat plus efficacement, et cela * fonctionne * vraiment. –

Questions connexes