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
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.
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);
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. –
- 1. Charger la mémoire partagée dans C
- 2. Comment charger ce tableau dans la mémoire
- 3. Charger l'assemblage de la mémoire
- 4. Comment charger immédiatement une autre page dans JSP/Spring?
- 5. Charger l'image de la mémoire dans VB6 PictureBox
- 6. Analyse syntaxique: charger dans la mémoire ou utiliser le flux
- 7. Rechercher un fichier XML sans le charger dans la mémoire?
- 8. peut sqlite charger des données 10M dans la mémoire
- 9. Attribution de pointeur immédiatement après la suppression
- 10. Comment charger les modules python compilés de la mémoire?
- 11. Charger une image Picturebox à partir de la mémoire?
- 12. Java: Est-ce que l'appel de clear() sur une liste libérerait de la mémoire immédiatement?
- 13. Toast Immédiatement
- 14. Méthode virtuelle d'appel immédiatement après la construction
- 15. comment charger un fichier dans un blob sans le charger dans la RAM en premier?
- 16. placer une valeur dans la position triée immédiatement
- 17. Désactiver automatiquement la machine Windows immédiatement
- 18. Figer immédiatement une AVCaptureSession
- 19. pthread_cond_timedwait retourner immédiatement
- 20. WPF ShowDialog renvoie immédiatement
- 21. Comment charger les signaux numériques d'un port USB dans la mémoire?
- 22. Est-il possible de charger SQLite db dans la mémoire et d'exécuter une requête?
- 23. Comment charger une application avec des DLL depuis la mémoire dans un AppDomain et l'exécuter?
- 24. Ajouter un enfant immédiatement dans Flex 3
- 25. jquery: fonction d'arrêt immédiatement
- 26. Lecture Flash() traitée immédiatement?
- 27. comment gérer l'événement lorsque des marqueurs charger en mémoire
- 28. accéder aux propriétés UIImage sans charger l'image en mémoire
- 29. Comment charger le noyau en mémoire, à partir d'un ISO
- 30. Créer un objet IObservable et renvoyer immédiatement le résultat d'une opération asynchrone en mémoire cache
Merci, mais comment puis-je accéder à plusieurs cadres d'image objet BitmapImage? –
Vous pouvez utiliser BitmapDecoder.Create(), alors vous pouvez obtenir tous les cadres. J'ai ajouté un paragraphe à ma réponse pour l'expliquer. –
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. –