BitmapImage DecodePixelWidth comportement étrange

Je rencontrais des problèmes de performances lors de l’affichage d’un grand nombre d’images. J’ai découvert que le problème était que l’image en pleine résolution était utilisée alors que je n’avais vraiment besoin que d’une image de moins d’un quart de la taille. J’ai donc ajouté une ligne entre BeginInit et EndInit pour définir DecodePixelWidth sur 200, ce qui correspond à la largeur maximale dont j’ai besoin dans ma présentation. Ma performance n’était plus un problème, mais certaines des images sont vraiment petites, certainement nulle part près de 200 pixels de large. La plupart des images semblaient s’afficher correctement et il ne semblait pas y avoir de rime ou de raison trop petite pour fonctionner correctement. Je pensais que cela pouvait être dû à des différences dans les dimensions d’origine des images, mais les résultats ne présentaient aucun motif. J’ai essayé de cogner la largeur jusqu’à 600, ce qui a ensuite permis aux images incriminées de s’afficher à la largeur correcte de 200, mais la performance en souffre.

À ce stade, je ne sais même pas par où commencer, et je serais vraiment reconnaissant pour un coup de pied dans la bonne direction.

EDIT: Quelques informations supplémentaires ci-dessous sur les images et leur utilisation.

La plupart des images tournent autour de 1000X1500, bien que certaines aient des dimensions impaires comme 1000×1513. Toutes les images sont au format JPEG. À l’heure actuelle, chaque image est placée dans un contrôle utilisateur personnalisé que j’ai conçu. Chaque contrôle utilisateur est ensuite placé dans une grid, dans sa propre ligne / colonne. La grid se trouve dans un défilement afin que l’utilisateur puisse faire défiler la liste. Ce n’est peut-être pas la meilleure façon d’accomplir ce que je recherche, mais c’est ce que j’ai rapidement trouvé et cela fonctionne pour la plupart. Je serais heureux de passer à une autre méthode d’affichage si cela permettait de réaliser ce que je voulais de manière plus simple ou plus concise.

Le résultat souhaité est une application de navigation dans les films. Il y aura une liste déroulante de films, chacun étant représenté par sa propre vignette complète avec titre, affiche du film, informations sur le genre, classements et description. Cette liste sera sortingable sur divers articles. Les informations sur les films sont stockées dans une firebase database SQL sur un autre ordinateur. Les images sont initialement stockées sur une autre machine, mais elles sont copiées localement pour améliorer les performances.

EDIT: J’ai pu résoudre le problème en n’utilisant pas DecodePixelWidth, mais en enregistrant une copie de l’image à la taille souhaitée, ce qui a amélioré les performances. La recommandation de Youngjae de ne pas utiliser DecodePixelWidth et sa mention d’utiliser une liste virtualisée m’ont amené à la série d’articles suivante sur la création d’un panneau de contrôle virtualisé qui devrait résoudre d’autres problèmes de performances. L’article est pour Silverlight, mais d’après ce que j’ai compris, Silverlight est fondamentalement une version allégée de wpf. Si cela fonctionne dans silverlight, il devrait fonctionner dans wpf. Il ne devrait pas être trop difficile de le convertir pour mon usage.

Partie 1 – MeasureOverride

Partie 2 – ArrangeOverride

Partie 3 – Animation

Partie 4 – Virtualisation

Dans le lien MSDN , vous pouvez trouver les mots ci-dessous.

Les codecs JPEG et Portable Network Graphics (PNG) décodent de manière native l’image à la taille spécifiée; d’autres codecs décodent l’image à sa taille d’origine et la redimensionnent à la taille souhaitée.

Et, je vous recommande de ne pas utiliser DecodePixelWidth à des fins de redimensionnement pour la raison ci-dessus.

Je ne connais pas vos tailles et formats d’image originaux, mais l’utilisation de la liste virtualisée et de n’est-elle pas suffisante?