2011-09-16 14 views
3

にカメラの画像をレンダリング私はuEyeカメラを持っていると私は1000ミリ秒間隔で画像のスナップショットを取り、私がしようとしていますので、WPFのImageコントロール

Bitmap MyBitmap; 

// get geometry of uEye image buffer 

int width = 0, height = 0, bitspp = 0, pitch = 0, bytespp = 0; 

long imagesize = 0; 

m_uEye.InquireImageMem(m_pCurMem, GetImageID(m_pCurMem), ref width, ref height, ref bitspp, ref pitch); 

bytespp = (bitspp + 1)/8; 

imagesize = width * height * bytespp; // image size in bytes 

// bulit a system bitmap 
MyBitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

// fill the system bitmap with the image data from the uEye SDK buffer 
BitmapData bd = MyBitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
m_uEye.CopyImageMem(m_pCurMem, GetImageID(m_pCurMem), bd.Scan0); 
MyBitmap.UnlockBits(bd); 

ようにWPF Imageコントロールにそれらをレンダリングしたいですこれらのビットマップをコントロールに1秒の割合で入力します。どのようにしてBitmapImageコントロールに表示させ、できるだけ早くそれらを処分して、小さなプログラマーになるために最小限のメモリフットプリントを残すことができますか?ここで

答えて

4

(それがロードCPUなしで200fpsで働く私のために(約5%))我々のやり方:

private WriteableBitmap PrepareForRendering(VideoBuffer videoBuffer) { 
     PixelFormat pixelFormat; 
     if (videoBuffer.pixelFormat == PixFrmt.rgb24) { 
      pixelFormat = PixelFormats.Rgb24; 
     } else if (videoBuffer.pixelFormat == PixFrmt.bgra32) { 
      pixelFormat = PixelFormats.Bgra32; 
     } else if (videoBuffer.pixelFormat == PixFrmt.bgr24) { 
      pixelFormat = PixelFormats.Bgr24; 
     } else { 
      throw new Exception("unsupported pixel format"); 
     } 
     var bitmap = new WriteableBitmap(
      videoBuffer.width, videoBuffer.height, 
      96, 96, 
      pixelFormat, null 
     ); 
     _imgVIew.Source = bitmap; 
     return bitmap; 
    } 

    private void DrawFrame(WriteableBitmap bitmap, VideoBuffer videoBuffer, double averangeFps) { 
     VerifyAccess(); 
     if (isPaused) { 
      return; 
     } 

     bitmap.Lock(); 
     try { 
      using (var ptr = videoBuffer.Lock()) { 
       bitmap.WritePixels(
        new Int32Rect(0, 0, videoBuffer.width, videoBuffer.height), 
        ptr.value, videoBuffer.size, videoBuffer.stride, 
        0, 0 
       ); 
      } 
     } finally { 
      bitmap.Unlock(); 
     } 
     fpsCaption.Text = averangeFps.ToString("F1"); 
    } 
関連する問題