C#程序攝像頭使用實例:照相程序


  今天給大家分享一個小程序:調用本機攝像頭實現照相的程序:


  廢話不多說了、直接進入主題吧、

  首先、創建一個WinForm程序、添加一個CameraAPI.cs類、用來調用微軟提供的攝像頭API函數用的、代碼如下所示:

CameraAPI.cs(攝像頭API調用類)
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace CameraVideoWithAPI
 8 {
 9     using System.Runtime.InteropServices;
10 
11     /// <summary>
12     /// 攝像頭API輔助類
13     /// </summary>
14     public class CameraAPI
15     {
16         //  視頻API調用
17         [DllImport("avicap32.dll")]
18         public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
19         [DllImport("avicap32.dll")]
20         public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);
21         [DllImport("User32.dll")]
22         public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);
23         [DllImport("User32.dll")]
24         public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam);
25         
26         //  常量
27         public const int WM_USER = 0x400;
28         public const int WS_CHILD = 0x40000000;
29         public const int WS_VISIBLE = 0x10000000;
30         public const int SWP_NOMOVE = 0x2;
31         public const int SWP_NOZORDER = 0x4;
32         public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;
33         public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;
34         public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;
35         public const int WM_CAP_SET_PREVIEW = WM_USER + 50;
36         public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;
37         public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;
38         public const int WM_CAP_START = WM_USER;
39         public const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
40 
41     }
42 }

 

  然后、新建一個Camera.cs類、用來調用CameraAPI.cs輔助類中定義的函數、實現打開視頻設備、關閉視頻設備以及拍照的功能,詳細代碼如下所示:

Camera.cs(功能實現類)
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Runtime.InteropServices;
 7 
 8 namespace CameraVideoWithAPI
 9 {
10     #region 攝像頭類輔助類
11     /// <summary>
12     /// 攝像頭類輔助類
13     /// </summary>
14     public class Camera
15     {
16         private IntPtr lwndC;       //保存無符號句柄
17       private IntPtr mControlPtr; //保存管理指示器
18       private int mWidth;
19         private int mHeight;
20 
21         #region 默認構造
22       /// <summary>
23         /// 默認構造
24       /// </summary>
25         /// <param name="handle"></param>
26         /// <param name="width"></param>
27         /// <param name="height"></param>
28         public Camera(IntPtr handle, int width, int height)
29         {
30             mControlPtr = handle; //顯示視頻控件的句柄
31             mWidth = width;      //視頻寬度
32             mHeight = height;    //視頻高度
33         }
34         #endregion
35 
36         #region 打開視頻設備
37       /// <summary>
38         /// 打開視頻設備
39       /// </summary>
40         public void StartWebCam()
41         {
42             byte[] lpszName = new byte[100];
43             byte[] lpszVer = new byte[100];
44             CameraAPI.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);
45             this.lwndC = CameraAPI.capCreateCaptureWindowA(lpszName, CameraAPI.WS_CHILD | CameraAPI.WS_VISIBLE, 0, 0, mWidth, mHeight, mControlPtr, 0);
46             if (CameraAPI.SendMessage(lwndC, CameraAPI.WM_CAP_DRIVER_CONNECT, 0, 0))
47             {
48                 CameraAPI.SendMessage(lwndC, CameraAPI.WM_CAP_SET_PREVIEWRATE, 100, 0);
49                 CameraAPI.SendMessage(lwndC, CameraAPI.WM_CAP_SET_PREVIEW, true, 0);
50             }
51         }
52         #endregion
53 
54         #region 關閉視頻設備
55       /// <summary>
56         /// 關閉視頻設備
57       /// </summary>
58         public void CloseWebcam()
59         {
60             CameraAPI.SendMessage(lwndC, CameraAPI.WM_CAP_DRIVER_DISCONNECT, 0, 0);
61         }
62         #endregion
63 
64         #region 拍照
65       ///   <summary>   
66         ///   拍照
67       ///   </summary>   
68         ///   <param   name="path">要保存bmp文件的路徑</param>   
69         public void GrabImage(IntPtr hWndC, string path)
70         {
71             IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
72             CameraAPI.SendMessage(lwndC, CameraAPI.WM_CAP_SAVEDIB, 0, hBmp.ToInt32());
73         }
74         #endregion
75     } 
76     #endregion
77 }

 

  然后、打開窗體、放入一個PictureBox控件、命名為“pic_camera”,用來在打開視頻設備后顯示實時圖像的區域;
  在拖入三個Button按鈕,分別命名為“btn_openCamera”(打開視頻設備,默認啟用)、“btn_closeCamera”(關閉視頻設備,默認禁用)、“btn_cameraPic”(拍照,默認禁用);

frmMain.cs(窗體的后置代碼)
 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 
11 namespace CameraVideoWithAPI
12 {
13     public partial class frmMain : Form
14     {
15         public frmMain()
16         {
17             InitializeComponent();
18         }
19 
20         Camera camera;  //攝像頭輔助類對象
21 
22         #region 打開視頻設備按鈕的事件
23         /// <summary>
24         /// 打開視頻設備按鈕的事件
25         /// </summary>
26         /// <param name="sender"></param>
27         /// <param name="e"></param>
28         private void btn_openCamera_Click(object sender, EventArgs e)
29         {
30             this.btn_openCamera.Enabled = false;    //打開視頻設備后,禁用“打開視頻設備”按鈕
31             this.btn_closeCamera.Enabled = true;    //打開視頻設備后,啟用“關閉視頻設備”按鈕
32             this.btn_cameraPic.Enabled = true;      //打開視頻設備后,啟用“拍照”按鈕
33 
34             camera = new Camera(this.pic_camera.Handle, this.pic_camera.Width, this.pic_camera.Height); //實例化Camera對象,傳入要顯示區域(PictureBox)的句柄及寬高
35             camera.StartWebCam();   //打開視頻設備
36         } 
37         #endregion
38 
39         #region 關閉視頻設備的事件
40         /// <summary>
41         /// 關閉視頻設備的事件
42         /// </summary>
43         /// <param name="sender"></param>
44         /// <param name="e"></param>
45         private void btn_closeCamera_Click(object sender, EventArgs e)
46         {
47             this.btn_openCamera.Enabled = true; //點擊關閉視頻設備后,啟用“打開視頻設備”按鈕
48             this.btn_closeCamera.Enabled = false;   //點擊關閉視頻設備后,禁用“關閉視頻設備”按鈕
49             this.btn_cameraPic.Enabled = false; //點擊關閉視頻設備后,禁用“拍照”按鈕
50 
51             camera.CloseWebcam();   //關閉視頻設備
52         } 
53         #endregion
54 
55         #region 拍照按鈕的事件
56         /// <summary>
57         /// 拍照按鈕的事件
58         /// </summary>
59         /// <param name="sender"></param>
60         /// <param name="e"></param>
61         private void btn_cameraPic_Click(object sender, EventArgs e)
62         {
63             camera.GrabImage(this.pic_camera.Handle, "guying.bmp"); //拍照功能、前一個參數是顯示圖像的PictureBox句柄,后一個參數是要保存圖片的路徑。
64         } 
65         #endregion
66     }
67 }


  至此、這個簡單的拍照程序就搞定了、、

  以上代碼主要講的是基礎、因此功能不完善、你也可以擴展一下功能、完善一下、例如:加一個保存圖片位置的功能等等、、、

【程序BUG:】

  點擊“打開視頻設備”按鈕后,有時不會及時打開、需要多試幾次、一般3-5次。

 

  好了、不費話了、歡迎提交您對本程序的一些建議及思路。

 

【原來來自:HackerGuying的博客:http://www.cnblogs.com/HackerGuying


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM