2009-11-19 53 views
5

Tôi cần viết ứng dụng để phát lại hình ảnh đa khung hình DICOM. Mỗi khung hình được lưu trữ ở định dạng JPEG. Tất cả các khung hình được lưu trữ liên tục trong một tập tin. Ngay bây giờ, tôi đọc ra từng khung dữ liệu và vượt qua nó để các thói quen sau đây để xây dựng một Bitmap để trưng bày:Cách nhanh nhất để giải nén ảnh JPEG trong 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; 
    } 

Trong kiểm tra, mọi thứ hoạt động tốt, ngoại trừ rằng hiệu suất trong các thói quen trên là không tối ưu. Đối với kích thước khung hình 800x600, thời gian trong quy trình này là 0msec và 15msec (tôi không biết tại sao). Đối với kích thước khung 1024x768, thời gian cần là 15msec hoặc 31msec. Mục tiêu của tôi là truyền dữ liệu hình ảnh vào và phát lại hình ảnh (phiên bản 1024x768) ở 60Hz mà không làm rơi khung hình. Điều đó cho thấy tôi phải giải nén khung JPEG trong 15msec liên tục. Vì vậy, câu hỏi của tôi là cách tốt hơn để làm điều này là gì?

Trả lời

6

Đó là 0 mili giây hoặc 15 mili giây vì bộ hẹn giờ của bạn thiếu độ phân giải. Sử dụng QueryPerformanceCounter để có được thời gian chính xác.

Bộ giải mã JPEG WPF (System.Windows.Media.Imaging) nhanh hơn bộ giải mã GDI +.

+0

Cảm ơn! Bạn có thể cho tôi một ví dụ về cách vẽ BitmapFrame được trả về bởi JpegBitmapDecoder không? Tôi không thể sử dụng Graphics.DrawImage() trong OnPaint() nữa. – JohnY

+0

Vẽ hình ảnh WPF bằng GDI + sẽ là một cơn đau. Nếu bạn phải kết xuất với WinForms, hãy gắn bó với các lớp GDI +. –

2

Tôi nhận thấy bạn có thể có những ràng buộc quy định yêu cầu về khung hình JPEG, nhưng cách tốt nhất để làm điều này là sử dụng định dạng khác được thiết kế cho video, như MEPG hoặc Quicktime. Dịch các khung hình JPEG của bạn thành một định dạng video được thiết kế để phát trực tiếp và phát trực tuyến.

0

Bạn có thể thử WIC, thành phần hình ảnh cửa sổ. Điều này có thể được sử dụng đằng sau hậu trường bởi WPF, được đề xuất trong một câu trả lời khác.

2

Ok, tôi đã tìm ra cách sử dụng System.Windows.Media.Imaging.JpegBitmapEncoder trong phương pháp bây giờ:

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

tôi đo hiệu quả hoạt động và nó dường như có sự cải thiện 100%. Công việc tốt đẹp từ WIC và WPF. Đang giải mã hình ảnh 1024x768 xuống còn 9 đến 10 mili giây ngay bây giờ.

Các vấn đề liên quan