2015-02-23 280 views
1

我正嘗試在我的c#應用程序中使用攝像頭拍照。我發現使用DirectShowLib。經過艱苦的研究,我找到了一個如何使用網絡攝像頭的例子,它在屏幕上顯示完美的視頻,但無法將位圖圖像保存在我的意願中。代碼使用DirectShowLib-2005的攝像頭拍攝的照片和視頻

樣品,我發現採取picure將

public Bitmap snapImage() 
    { 
     IVMRWindowlessControl9 windowlessCtrl = null; 
     IBaseFilter vmr9 = null; 
     vmr9 = (IBaseFilter)new DirectShowLib.VideoMixingRenderer9(); 
     DirectShowLib.IVMRFilterConfig9 filterConfig = (DirectShowLib.IVMRFilterConfig9)vmr9; 
     int hr = filterConfig.SetNumberOfStreams(1); 
     hr = filterConfig.SetRenderingMode(DirectShowLib.VMR9Mode.Windowless); 

     windowlessCtrl = (IVMRWindowlessControl9)vmr9; 
     hr = windowlessCtrl.SetVideoClippingWindow(this.PreviewWindow.Handle); 
     hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); 

     IntPtr currentImage = IntPtr.Zero; 

     Bitmap bmp = null; 

     //this is the line in wich I have problems 
     hr = windowlessCtrl.GetCurrentImage(out currentImage); 

     BitmapInfoHeader structure = new BitmapInfoHeader(); 
     Marshal.PtrToStructure(currentImage, structure); 

     bmp = new Bitmap(structure.Width, structure.Height, (structure.BitCount/8) * structure.Width, System.Drawing.Imaging.PixelFormat.Format32bppArgb, new IntPtr(currentImage.ToInt64() + 40)); 

     return bmp; 
    } 

而且我得到了:錯誤代碼「錯誤HRESULT E_FAIL已經從COM組件的調用返回」 -2147467259

我發現的樣品可以在本頁http://www.codeproject.com/Articles/34663/DirectShow-Examples-for-Using-SampleGrabber-for-Gr

任何人都可以幫我拍快照嗎?或者任何一個可以告訴我怎麼做我想做的事(顯示視頻和拍攝攝像頭的快照)

Thankk你

+0

海,你能解決這個問題。我現在面臨同樣的問題。:-( – 2015-03-05 11:10:10

回答

0

GetCurrentImage可能會返回E_FAIL(由設計行爲),直到顯示一個真正的視頻幀,這是異步發生的。要檢查這一點,只需在有問題的電話前顯示一個消息框,等到視頻開始流式傳輸,關閉該框,並且應該按照您最初的預期工作。

相關問題