2009-11-19 6 views
5

Je dois écrire une application pour lire une image multitrames DICOM. Chaque image est stockée au format JPEG. Toutes les images sont stockées consécutivement dans un fichier. En ce moment, je lis sur chaque donnée de trame et de le transmettre à la routine suivante pour construire un Bitmap pour l'affichage:Quel est le moyen le plus rapide de décompresser des images JPEG en C#

Bitmap CreateBitmap(byte[] pixelBuffer, int frameSize) 
    { 
     Bitmap image = null; 

     try 
     { 
      long startTicks = DateTime.Now.Ticks; 
      MemoryStream pixelStream = new MemoryStream(pixelBuffer, 0, frameSize); 
      image = new Bitmap(pixelStream); 
      loadTime = DateTime.Now.Ticks - startTicks; 
     } 
     catch (Exception ex) 
     { 
      Log.LogException(ex); 
     } 

     return image; 
    } 

Pendant l'essai, tout fonctionne bien sauf que la performance dans la routine ci-dessus n'est pas optimale. Pour la taille d'image 800x600, le temps qu'il faut dans cette routine est soit 0msec et 15msec (je ne sais pas pourquoi). Pour la taille d'image 1024x768, le temps nécessaire est de 15 ms ou 31 ms. Mon objectif est de diffuser les données d'image dans et lire l'image (version 1024x768) en 60Hz sans laisser tomber une image. Cela suggère que je dois décompresser le cadre JPEG en 15 ms constamment. Alors ma question est quelle est la meilleure façon de faire cela?

Répondre

6

Il est 0 msec ou 15 msec car votre horloge manque de résolution. Utilisez QueryPerformanceCounter pour obtenir des heures précises.

Le décodeur WPF JPEG (System.Windows.Media.Imaging) est plus rapide que le décodeur GDI +.

+0

Merci! Pourriez-vous me donner un exemple de la façon de dessiner le BitmapFrame retourné par le JpegBitmapDecoder? Je ne peux plus utiliser Graphics.DrawImage() dans OnPaint(). – JohnY

+0

Dessiner une image WPF en utilisant GDI + sera pénible. Si vous devez rendre à WinForms, alors restez avec les classes GDI +. –

2

Je me rends compte que vous avez probablement des contraintes qui dictent la condition de trame JPEG, mais le meilleur moyen d'y parvenir est d'utiliser un format différent conçu pour la vidéo, comme MEPG ou Quicktime. Traduisez vos images JPEG dans un format vidéo conçu pour la diffusion en continu et en streaming.

0

Vous pouvez essayer WIC, le composant d'imagerie Windows. Ceci est probablement utilisé dans les coulisses par WPF, suggéré dans une autre réponse.

2

Ok, je me suis dit comment utiliser System.Windows.Media.Imaging.JpegBitmapEncoder dans la méthode maintenant:

  JpegBitmapDecoder decoder = new JpegBitmapDecoder(pixelStream, BitmapCreateOptions.None, BitmapCacheOption.None); 
      BitmapFrame frame = decoder.Frames[0]; 
      frame.CopyPixels(pixelBuffer, stride, 0); 

Je mesure de la performance et il semble avoir 100% d'amélioration. Beau travail de WIC et WPF. Décodage 1024x768 image est en baisse de 9 à 10 msec maintenant.

Questions connexes