2009-11-19 21 views
5

Bir DICOM çoklu çerçeve görüntüsünü oynatmak için bir uygulama yazmam gerekiyor. Her çerçeve JPEG formatında saklanır. Tüm kareler tek bir dosyada ardışık olarak saklanır. Şu anda, her çerçeve verileri okumak ve görüntüleme için bir Bitmap oluşturmak için aşağıdaki rutin geçmek:JPEG görüntülerini sıkıştırmanın en hızlı yolu nedir? 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; 
    } 

Test sırasında, her şey yukarıdaki rutin performans optimum olmadığını dışında çalışıyor. 800x600 çerçeve boyutu için, bu yordamda geçen süre 0msec ve 15msec (nedenini bilmiyorum). 1024x768 çerçeve boyutu için gereken süre 15msec veya 31msec'dir. Amacım görüntü verisini akışa almak ve görüntüyü (1024x768 sürümü) 60Hz'de bir kare düşürmeden oynatmaktır. Bu, JPEG çerçevesini sürekli olarak 15 msn içinde açmam gerektiğini gösterir. Yani sorum şu, bunu yapmanın en iyi yolu nedir?

cevap

6

Saatinizin çözünürlüğü olmadığından 0 msn veya 15 milisaniyedir. Doğru zaman elde etmek için QueryPerformanceCounter kullanın.

WPF JPEG kod çözücüsü (System.Windows.Media.Imaging) GDI + kod çözücüsünden daha hızlıdır.

+0

Teşekkürler! JpegBitmapDecoder tarafından döndürülen BitmapFrame'in nasıl çizileceğine dair bir örnek verebilir misiniz? Artık Graphics.DrawImage() öğesini OnPaint() içinde kullanamıyorum. – JohnY

+0

GDI + kullanarak bir WPF görüntüsü çizmek bir acı olacaktır. WinForms'a işlemek zorundaysanız, GDI + sınıflarına bağlı kalın. –

2

Muhtemelen JPEG çerçeve gereksinimini belirleyen kısıtlamalara sahip olduğunuzu biliyorum, ancak bunu yapmanın en iyi yolu MEPG veya Quicktime gibi video için tasarlanmış farklı bir biçim kullanmaktır. JPEG çerçevelerinizi akış ve akış için tasarlanmış bir video biçimine dönüştürün.

0

WIC, Windows görüntüleme bileşenini deneyebilirsiniz. Bu muhtemelen başka bir cevapta önerilen WPF tarafından sahnelerin arkasında kullanılır.

2

Tamam, şimdi yöntemde System.Windows.Media.Imaging.JpegBitmapEncoder nasıl kullanılacağını anladım:

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

Ben performansı ölçülmüş ve% 100 iyileşme var gibi görünüyor. WIC ve WPF'den güzel bir iş. 1024x768 çözünürlüğünü düzeltmek artık 9 ila 10 msn'ye düştü.

İlgili konular