2009-11-19 21 views
5

Ho bisogno di scrivere un'app per riprodurre un'immagine DICOM multiframe. Ogni frame è memorizzato in formato JPEG. Tutti i frame sono memorizzati consecutivamente in un unico file. In questo momento, ho letto ogni dati telaio e passarlo al seguente routine per costruire un bitmap per la visualizzazione:Qual è il modo più veloce per decomprimere le immagini JPEG in 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; 
    } 

Durante la prova, tutto funziona bene tranne che le prestazioni nella routine di cui sopra non è ottimale. Per le dimensioni del frame 800x600, il tempo impiegato da questa routine è 0msec e 15msec (non so perché). Per le dimensioni del fotogramma 1024x768, il tempo richiesto è 15msec o 31msec. Il mio obiettivo è quello di trasmettere in streaming i dati dell'immagine e riprodurre l'immagine (versione 1024x768) in 60 Hz senza rilasciare una cornice. Ciò suggerisce che devo decomprimere costantemente il frame JPEG entro 15msec. Quindi la mia domanda è qual è il modo migliore per farlo?

risposta

6

È 0 msec o 15 msec perché il timer non ha risoluzione. Utilizzare QueryPerformanceCounter per ottenere tempi precisi.

Il decodificatore JPEG WPF (System.Windows.Media.Imaging) è più veloce del decodificatore GDI +.

+0

Grazie! Potresti darmi un esempio di come disegnare il BitmapFrame restituito da JpegBitmapDecoder? Non riesco più a utilizzare Graphics.DrawImage() in OnPaint(). – JohnY

+0

Disegnare un'immagine WPF usando GDI + sarà un problema. Se devi eseguire il rendering su WinForms, segui le classi GDI +. –

2

Mi rendo conto che probabilmente avete dei vincoli che dettano i requisiti del frame JPEG, ma il modo migliore per farlo è usare un formato diverso progettato per i video, come MEPG o Quicktime. Traducete invece i vostri frame JPEG in un formato video progettato per lo streaming e lo streaming.

0

Si potrebbe provare WIC, il componente di imaging di Windows. Questo è probabilmente usato dietro le quinte di WPF, suggerito in un'altra risposta.

2

Ok, ho capito come utilizzare System.Windows.Media.Imaging.JpegBitmapEncoder nel metodo ora:

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

ho misurato le prestazioni e sembra avere miglioramento del 100%. Bel lavoro da WIC e WPF. La decodifica dell'immagine 1024x768 è ridotta a 9-10 msec ora.

Problemi correlati