Quel est le moyen le plus rapide de décompresser les images JPEG en C #

Je dois écrire une application pour lire une image multitrame DICOM. Chaque image est stockée au format JPEG. Toutes les images sont stockées consécutivement dans un seul fichier. En ce moment, je lis chaque donnée de trame et la passe à la routine suivante pour construire une bitmap pour l’affichage:

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 le test, tout fonctionne bien, sauf que les performances dans la routine ci-dessus ne sont pas optimales. Pour la taille de trame 800×600, le temps nécessaire à cette routine est de 0 ms et de 15 ms (je ne sais pas pourquoi). Pour la taille de trame 1024×768, le temps nécessaire est de 15 ms ou 31 ms. Mon objective est de diffuser les données d’image et de lire l’image (version 1024×768) en 60Hz sans perdre d’image. Cela suggère que je dois décompresser la trame JPEG en moins de 15 ms. Donc, ma question est la suivante: quelle est la meilleure façon de le faire?

C’est 0 msec ou 15 msec parce que votre timer manque de résolution. Utilisez QueryPerformanceCounter pour obtenir des temps précis.

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

Je me rends compte que vous avez probablement des contraintes qui dictent l’exigence d’image JPEG, mais la meilleure façon de faire 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 et la diffusion en continu.

Ok, j’ai compris 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, ssortingde, 0); 

J’ai mesuré la performance et il semble y avoir une amélioration de 100%. Bon travail de WIC et WPF. Le décodage de l’image 1024×768 est maintenant de 9 à 10 msec.

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.