從正式工做以來一直作的都是基於B/S的Web開發,已經很長時間不研究C/S的東西了,可是受朋友的委託,幫他作一下拍照的這麼個小功能。其實相似的代碼網上有不少,可是真的可以拿來運行的估計也沒幾個。原本是說週末給作的,可是這兩天腦子一直很亂,也沒靜下來,晚上了,再不作明天有點很差意思啊,只能臨時作一個了。在網上找資料本身作的過程當中也發現了一些問題,因而拿到博客上來分享一下,這樣一來有須要的朋友能夠直接拿來用,二來正在研究的遇到這些問題了能夠迎刃而解。ide
剛開始接觸攝像頭視頻之類的是在大二的時候,那時候由於實驗室有一個小項目交到我手上,因此那時候對播放視頻之類的瞭解了一些。那時候的需求是對已經錄下來的監控錄像作處理,整個過程是已經不須要本身再去控制錄像了,因此相對簡單一點。而拍照和攝像是本身控制,因此稍微複雜那麼一點點。行了,廢話說到這裏,下面進入正題。工具
仍是以往的做風,只實現功能,對界面不作過多的美化,有須要的朋友能夠本身動手。比較這年頭本身動手,豐衣足食嘛。圖1-1是程序的主界面:this
圖1-1spa
操做攝像頭以及實現拍照功能整個過程主要都是經過一個第三方的組件實現的,名字叫作 AForge ,是國外的組件,因此打開起來有點慢,可是要有耐心啊,目前已經更新到2.2.5版本了。若是不肯意從官網上下載,文章末尾處也給出了相應的下載地址,須要的話直接拿來用就ok了。程序也很簡單,一個WinForm頁面,添加一下對Aforge的引用就能夠了,可是這個過程當中會引用一些其餘的dll,有些不是太經常使用,因此在這裏對引用的dll也作了截圖(圖1-2),在本身作的過程當中參照一下便可。.net
圖1-2 code
上圖1-1中間部分是用來實時顯示攝像頭開啓後獲取到的內容,是一個自定義控件。這裏得說明一下,將AForge.Controls.dll拖拽到左側的工具箱區域,而後就出來自定義控件了。這裏順便說明一下,咱們平時本身開發的自定義控件也能夠經過這種方式來給別人用。前臺都準備好了以後咱們來開始分析後臺代碼。orm
整個的思路是先找到電腦上的攝像頭設備,而後選擇咱們須要操做的設備,而後在拍照或者攝像。今天因爲時間關係僅僅只是實現拍照,下次再作攝像的功能,實現以後也會同樣分享在這裏的,但願有須要的朋友關注。視頻
當Form加載的時候,咱們監聽一下其Load事件,將檢測到的攝像頭設備添加到後邊的ComboBox中供用戶選擇,關鍵代碼以下:blog
private void Form1_Load(object sender, EventArgs e) { try { // 枚舉全部視頻輸入設備 videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == 0) throw new ApplicationException(); foreach (FilterInfo device in videoDevices) { tscbxCameras.Items.Add(device.Name); } tscbxCameras.SelectedIndex = 0; } catch (ApplicationException) { tscbxCameras.Items.Add("No local capture devices"); videoDevices = null; } }
當用戶選擇某一攝像頭設備再點擊鏈接的時候,咱們打開攝像頭,並對其進行初始化,關鍵代碼:事件
//鏈接攝像頭 private void CameraConn() { VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString); videoSource.DesiredFrameSize = new System.Drawing.Size(320, 240); videoSource.DesiredFrameRate = 1; videoSourcePlayer.VideoSource = videoSource; videoSourcePlayer.Start(); }
當用戶關閉點擊關閉攝像頭的時候,咱們作關閉的處理,代碼:
//關閉攝像頭 private void btnClose_Click(object sender, EventArgs e) { videoSourcePlayer.SignalToStop(); videoSourcePlayer.WaitForStop(); }
當用戶點擊拍照的時候,咱們獲取攝像頭當前的畫面,並保存到設定的路徑下,而後關閉當前窗口。關鍵代碼:
//拍照 private void Photograph_Click(object sender, EventArgs e) { try { if (videoSourcePlayer.IsRunning) { BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( videoSourcePlayer.GetCurrentVideoFrame().GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); PngBitmapEncoder pE = new PngBitmapEncoder(); pE.Frames.Add(BitmapFrame.Create(bitmapSource)); string picName = GetImagePath() + "\\" + "xiaosy" + ".jpg"; if (File.Exists(picName)) { File.Delete(picName); } using (Stream stream = File.Create(picName)) { pE.Save(stream); } //拍照完成後關攝像頭並刷新同時關窗體 if (videoSourcePlayer != null && videoSourcePlayer.IsRunning) { videoSourcePlayer.SignalToStop(); videoSourcePlayer.WaitForStop(); } this.Close(); } } catch (Exception ex) { MessageBox.Show("攝像頭異常:" + ex.Message); } } private string GetImagePath() { string personImgPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) + Path.DirectorySeparatorChar.ToString() + "PersonImg"; if (!Directory.Exists(personImgPath)) { Directory.CreateDirectory(personImgPath); } return personImgPath; }
關閉以後,在bin目錄下的PersonImg中便可找到保存的圖片,固然,在程序中把該圖片展現出來效果會更好,可是因爲時間關係,就不添加了。須要的朋友能夠本身實現,有問題的歡迎一塊兒交流。
至此,這樣一個簡單的拍照功能就完成了,在這裏,附上源碼下載地址。
源碼下載:http://download.csdn.net/detail/jrlxsy/6927833
您的支持,是我分享的動力,謝謝!