2013-11-03 69 views
1

我想將我從示例採集器中獲得的每個幀轉換爲位圖,但它似乎不起作用。ISampleGrabberCB ::示例不工作

我用SampleCB如下:

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample sample) 
    { 
     try 
     { 
      int lengthOfFrame = sample.GetActualDataLength(); 
      IntPtr buffer; 
      if (sample.GetPointer(out buffer) == 0 && lengthOfFrame > 0) 
      { 
       Bitmap bitmapOfFrame = new Bitmap(width, height, capturePitch, PixelFormat.Format24bppRgb, buffer); 
       Graphics g = Graphics.FromImage(bitmapOfFrame); 
       Pen framePen = new Pen(Color.Black); 
       g.DrawLine(framePen, 30, 30, 50, 50); 
       g.Flush(); 
      } 
     CopyMemory(imageBuffer, buffer, lengthOfFrame);   
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

     Marshal.ReleaseComObject(sample); 


     return 0; 
    } 

我畫上有一個小的圖形作爲測試人員,它似乎並沒有工作。從我相信這應該是添加一個小行到每個幀,因此更新我的預覽線。

如果需要的話我可以給額外的代碼(如我如何設置我的圖形和連接我的ISampleGrabber)

編輯與我想迪週一表示:

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample sample) 
{ 
    try 
    {   

     int lengthOfFrame = sample.GetActualDataLength(); 
     IntPtr buffer; 
     BitmapData bitmapData = new BitmapData(); 
     if (sample.GetPointer(out buffer) == 0 && lengthOfFrame > 0) 
     {      
      Bitmap bitmapOfFrame = new Bitmap(width, height, capturePitch, PixelFormat.Format24bppRgb, buffer);      
      Graphics g = Graphics.FromImage(bitmapOfFrame); 
      Pen framePen = new Pen(Color.Black); 
      g.DrawLine(framePen, 30, 30, 50, 50); 
      g.Flush(); 
      Rectangle rect = new Rectangle(0, 0, bitmapOfFrame.Width, bitmapOfFrame.Height); 
      bitmapData = bitmapOfFrame.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 

      IntPtr bitmapPointer = bitmapData.Scan0; 


      CopyMemory(bitmapPointer, buffer, lengthOfFrame); 
      BitmapOfFrame.UnlockData(bitmapData); 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 

    Marshal.ReleaseComObject(sample); 


    return 0; 
} 

回答

2

當你創建一個位圖它將數據複製到其自己的內部緩衝區,並且所有繪圖都進入該緩衝區,而不是在您的緩衝區中。在位圖中繪製東西后,使用Bitmap.LockBits和BitmapData類來獲取其內容。

+0

我已經添加了我對原始帖子中的含義的解釋。你是這個意思嗎? – legohead

+0

那麼,你已經有了bitmapData,但是你並沒有使用它。至少在這個片段。你想要更新的圖片保存在一個bmp文件中,或只是傳遞給一個渲染器? –

+0

基本上我想處理每一個新的框架。我想使用位圖來完成這個任務,因爲外部庫需要處理每個圖像,我還想爲每個幀繪製一個十字準線,所以我認爲將圖形添加到位圖會比其他方法更容易。 – legohead