2009-11-19 12 views
5

Necesito escribir una aplicación para reproducir una imagen de multitrama DICOM. Cada cuadro está almacenado en formato JPEG. Todos los marcos se almacenan consecutivamente en un archivo. En este momento, voy a leer los datos de cada frame y pasarlo a la siguiente rutina para construir un mapa de bits para la exhibición:¿Cuál es la forma más rápida de descomprimir imágenes 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; 
    } 

Durante la prueba, todo funciona bien, excepto que el rendimiento en la rutina anterior no es óptima. Para el tamaño de fotograma de 800x600, el tiempo que lleva en esta rutina es 0 ms y 15 ms (no sé por qué). Para el tamaño de fotograma de 1024x768, el tiempo que toma es 15 mseg o 31 mseg. Mi objetivo es transmitir los datos de imagen y reproducir la imagen (versión 1024x768) en 60Hz sin dejar caer un fotograma. Eso sugiere que tengo que descomprimir el cuadro JPEG dentro de 15 mseg constantemente. Entonces mi pregunta es ¿cuál es la mejor manera de hacer esto?

Respuesta

6

Es 0 mseg o 15 mseg porque su temporizador carece de resolución. Use QueryPerformanceCounter para obtener los tiempos precisos.

El decodificador JPEG de WPF (System.Windows.Media.Imaging) es más rápido que el decodificador GDI +.

+0

Gracias! ¿Podría darme un ejemplo de cómo dibujar el BitmapFrame devuelto por JpegBitmapDecoder? Ya no puedo usar Graphics.DrawImage() en OnPaint(). – JohnY

+0

Dibujar una imagen WPF usando GDI + será un problema. Si tiene que renderizar a WinForms, entonces quédese con las clases de GDI +. –

2

Me doy cuenta de que probablemente tenga restricciones que dictan el requisito de marcos JPEG, pero la mejor manera de hacerlo es utilizar un formato diferente diseñado para video, como MEPG o Quicktime. Traduce tus cuadros JPEG a un formato de video diseñado para transmitirlos y transmitirlos en su lugar.

0

Puede probar WIC, el componente de imágenes de Windows. Esto es probablemente usado detrás de escena por WPF, sugerido en otra respuesta.

2

Ok, me di cuenta de cómo utilizar System.Windows.Media.Imaging.JpegBitmapEncoder en el método ahora:

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

que mide el rendimiento y que parece tener mejora del 100%. Buen trabajo de WIC y WPF. La descodificación de la imagen de 1024x768 se ha reducido a 9 a 10 mseg ahora.

Cuestiones relacionadas