2011-09-16 87 views
3

我有一個的uEye相機和我拍攝圖像的快照在1000毫秒的時間間隔,我想使它們在WPF Image控制,像這樣呈現出攝像機圖像的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); 

我想將這些位圖以1秒的速率放入Image控件中。我怎樣才能讓Bitmap出現在Image控件中,並在我完成操作後立即處理它們,讓最小的內存足跡成爲一個優秀的小程序員:)?

回答

4

在這裏,我們做的方式(對我來說它工作在200fps無負載CPU(約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"); 
    }