2009-11-19 17 views
5

DICOMマルチフレーム画像を再生するにはアプリを書く必要があります。各フレームはJPEG形式で保存されます。すべてのフレームは、1つのファイルに連続して格納されます。今、私は、各フレームのデータを読み出して表示用のビットマップを構築するために、次のルーチンに渡し:C#でJPEG画像を解凍する最も速い方法は

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; 
    } 

試験中、すべてのものは、上記のルーチンでのパフォーマンスが最適ではないことを除いて正常に動作します。 800x600のフレームサイズの場合、このルーチンにかかる時間は0msecと15msecです(私には分かりません)。 1024×768のフレームサイズの場合、所要時間は15msecまたは31msecです。私の目標は、フレームを落とすことなく60Hzで画像データをストリーミングして、画像(1024x768バージョン)を再生することです。つまり、JPEGフレームを15msec以内に圧縮解除する必要があります。だから私の質問は、これを行うためのより良い方法は何ですか?

答えて

6

タイマーが解決されていないため、0ミリ秒または15ミリ秒です。正確な時間を得るにはQueryPerformanceCounterを使用してください。

WPF JPEGデコーダ(System.Windows.Media.Imaging)は、GDI +デコーダよりも高速です。

+0

ありがとうございます! JpegBitmapDecoderから返されたBitmapFrameを描画する方法の例を教えてください。私はもうGraphics.DrawImage()をOnPaint()で使用することはできません。 – JohnY

+0

GDI +を使用してWPFイメージを描画するのは苦労します。 WinFormsにレンダリングする必要がある場合は、GDI +クラスを使用してください。 –

2

私はおそらくJPEGフレーム要件を指定する制約があることを認識していますが、これを行う最も良い方法は、MEPGやQuicktimeのようなビデオ用に設計された別のフォーマットを使用することです。代わりにJPEGフレームをストリーミング用に設計されたビデオフォーマットに変換してストリームします。

0

WindowsイメージングコンポーネントであるWICを試すことができます。これは恐らくWPFの裏で使用され、別の答えで示唆されています。

2

[OK]を、私は今の方法でSystem.Windows.Media.Imaging.JpegBitmapEncoderを使用する方法を考え出し:

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

私は、パフォーマンスを測定し、100%の改善を持っているようです。 WICとWPFの素晴らしい仕事。 1024x768の画像をデコードするのが9〜10ミリ秒に短縮されました。