2010-08-25 5 views
7

J'essaie de charger rapidement des images dans une zone d'image et de les dessiner. J'ai un retard de 0,13 seconde entre le moment où j'assigne un bitmap à la zone d'image et quand il apparaît. Et chaque fois que je fais un picturebox.refresh(), c'est le même délai de 0,13 - 0,15 secondes avant que la méthode de peinture soit appelée. Est-il possible de se débarrasser de ce retard? J'utilise C# dans Visual Studio 2010. Je charge les images en utilisant la bibliothèque FreeImage.Afficher la zone d'image plus rapidement

Voici le code dans mon cas pictureBox_MouseMove:

if (IsMouseDown || DrawLine.Checked || IsMovingBox) 
{ 
    Tracing.Trace("Update Picture Box"); 
    pictureBox.Refresh(); 
} 

Puis je trace une ligne quand mon événement de peinture est appelée. Le retard est entre les deux lignes de trace. Si j'utilise une image tiff bitonal à 117 ko, le délai est de 0,13 seconde. Pour charger cette image dans la mémoire prend .04 secondes. Pour remplacer ma bitmap picturebox avec cette bitmap prend 0,01 secondes.

Si j'utilise une image jpg à échelle de gris à 1125 ko, le délai est de 0,14 secondes. Pour charger cette image dans la mémoire prend .26 secondes. Pour remplacer ma bitmap picturebox avec ce bitmap prend 0,03 secondes.

Répondre

11

Si l'on suppose qu'il n'y a pas d'autres retards dans votre code qui empêcheraient le thread d'interface utilisateur de revenir dans la boucle de message afin que la méthode OnPaint() peut être appelé: votre gestionnaire d'événements Paint est appelée après PictureBox a attiré l' Image. Il n'est pas encore visible, PB utilise le double-buffering.

Cette image coûte cher à dessiner lorsqu'elle doit être redimensionnée pour s'adapter à la zone client du PB. Ce qui est très probable dans votre cas, car vos images sont assez volumineuses. Il utilise un filtre bi-cubique de haute qualité pour donner une belle apparence à l'image redimensionnée. C'est assez cher, même si le résultat est bon.

Pour éviter cette dépense, redimensionnez l'image vous-même avant de l'affecter à la propriété Image. Faites-le tout aussi grand que ClientSize du PB.

Cela va faire une grande différence en soi. La prochaine chose que vous pouvez faire est de créer le bitmap mis à l'échelle avec le format de pixel 32bppPArgb. C'est le format qui est environ 10 fois plus rapide que n'importe quel autre parce qu'il correspond à la carte vidéo sur la plupart des machines donc aucune conversion de format de pixel n'est nécessaire.

Certains code:

private void loadImage(string path) { 
     using (var srce = new Bitmap(path)) { 
      var dest = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 
      using (var gr = Graphics.FromImage(dest)) { 
       gr.DrawImage(srce, new Rectangle(Point.Empty, dest.Size)); 
      } 
      if (pictureBox1.Image != null) pictureBox1.Dispose(); 
      pictureBox1.Image = dest; 
     } 
    } 

Vous aurez probablement envie de bricoler avec ce que l'image conserve son rapport d'aspect. Essayez-le d'abord afin de vous assurer d'obtenir l'amélioration de la performance.

+0

Hans, ça peut le faire! Les premiers tests sont définitivement meilleurs! En l'insérant dans mon code ici et en réglant le format correctement ... – Mark

+0

Hans, C'était parfait! Très agréable! Merci! – Mark

Questions connexes