2010-10-19 3 views
0

Je dois charger 101 bitmaps à partir du système de fichiers (ils ne peuvent pas être intégrés dans l'application en tant que ressource car ils seront modifiés pour chaque exécution du programme) dans un formulaire Windows application picturebox séquentiellement sur la base d'événements de temporisation de courte durée (500ms donner ou prendre). Essentiellement, cela devrait fonctionner comme une animation lente mais il est essentiel que chaque image soit montrée. J'ai fait une application simple en C# pour cela, mais il semble que le chargement et l'affichage de l'image prennent plus de temps que 500ms, donc certaines images ne sont jamais affichées.Chargement et affichage rapides d'images dans une zone d'image

Y at-il un moyen de l'éviter? Préchargement ou création de 101 images et affichage et masquage?

Quelqu'un a des suggestions?

+0

Est-ce que l'un de ces aide de réponse? –

Répondre

1

le plus long? Chargement ou affichage de l'image? Chargez-vous chaque image quand elle a besoin d'être affichée? Un regard sur votre code serait vraiment utile.

Si vous êtes certain que ce sera toujours exactement 101 images, les charger dans un tableau de System.Drawing.Bitmappremier ont alors une variable itérateur qui obtient incrémenté à chaque appel de l'événement Tick d'un Timer. Avoir cet événement de tic charger l'image du tableau dans le PictureBox en utilisant PictureBox.Image = myBitmapArray[iterator] Si vous incrémentez l'itérateur en utilisant ++i%=101; vous n'obtiendrez pas une erreur OutOfBounds et l'animation sera en boucle.

1

Remplir un tableau d'objets Bitmap avant de démarrer l'animation.

0

Je n'ai pas de réponse concrète pour vous, mais j'aborderais cela en déterminant d'abord si le chargement de l'image, l'affichage de l'image ou les deux actions prennent trop de temps.

J'imagine que le chargement de l'image va être relativement rapide, même avec de très grandes tailles d'image, à condition que les images soient locales et que vous ayez un matériel relativement décent. Ma première tentative impliquera le chargement séquentiel de toutes les images à partir d'un thread afin que votre application n'ait pas à attendre que l'affichage de l'image se termine avant le chargement de l'image suivante.

Si l'affichage de l'image prend beaucoup de temps (et même sur mon poste de travail vraiment puissant, il n'est pas très rapide pour les grandes images), alors est-il possible de mettre à l'échelle les images avant que l'application affiche tout? Votre application doit-elle traiter des images en pleine résolution? Avec les caméras mégapixels de nos jours, je ne peux pas imaginer que vous souhaitiez avoir toutes les données présentes dans les fichiers image, car les tailles peuvent facilement dépasser les résolutions du moniteur par un facteur de 6.

0

Une autre chose qui peut être un problème est la taille des images. Si les images sont toutes de 18 mégapixels, je peux le voir prendre beaucoup de temps ou beaucoup de place. Vous voudrez peut-être les redimensionner à la taille de votre zone d'affichage lorsque vous les chargez initialement de sorte que vous n'utilisiez pas 2 Go de RAM ou n'attendiez pas de lire le disque en fonction de la façon dont vous l'avez implémenté.

1

Quelques options ... choisir un ou les combiner:

(1) Utilisez une serrure et un compteur pour garantir que lorsque l'événement se déclenche son chargement l'image suivante dans la ligne.(2) Désactivez le temporisateur dans l'événement Tick, puis réactivez-le après avoir chargé l'image. Le résultat est que les images arrivent 500ms après que le dernier est dessiné, donc si une image prend une seconde à charger, les images sont dessinées à t = 1000ms, t = 1500ms, t = 3000ms, etc. Toutes les images sont dessinées, et 500ms est garanti pour passer entre les images, mais l'animation peut sembler lente.

(3) Faites ce qui précède, mais suivez l'heure du début de l'événement, et après que l'image est dessinée, réglez la coche du prochain temporisateur sur 500 - (Now - eventStart) ... de sorte que l'image prenne 250ms pour tirer, la prochaine tique du chronomètre tirera en 250ms. Si Maintenant - eventStart < 0, la prochaine coche du chronomètre devrait se déclencher immédiatement. L'animation prendra le minimum de temps possible, mais les images pourraient potentiellement flasher, apparaissant seulement pendant quelques millisecondes.

(4) Utilisez PictureBox.LoadAsync() pour vous donner un peu de multithreading ... l'événement suivant peut charger l'image pendant que l'événement précédent dessine. Mais vous aurez besoin d'un Mutex que vous libérez dans l'événement LoadCompleted que vous attendez avant d'appeler LoadAsync(), si vous avez besoin de garantir que les images sont toutes dessinées.

(5) Je ne sais pas si le dessin de l'image relève de la catégorie Mise en forme, mais vous pouvez essayer d'appeler SuspendLayout() et ResumeLayout() avant/après le chargement de l'image

(6) Utilisez un tableau d'images , verrouillez un compteur et utilisez la propriété .Image du PictureBox pour vous permettre de précharger les images. Je crois que cela a été suggéré dans une autre réponse, aussi

HTH,
James

Questions connexes