需求分析

现如今,拍照已经融入我们的日常生活中了。我们在日常的工作生活中很多场景都会用到拍照功能。比如在登录网页或者设备时,密码错误进行拍照,防止被盗。日常进行图像识别或者图像处理前的图像获取。都需要用到我们的摄像头进行图像的获取。


前期准备


  • 带摄像头的电脑
  • Visual Studio 2019
  • AForge.NET Framework库文件

设计流程


  • 首先我们在Visual Studio 2019创建一个工程
  • 添加引用文件(不会使用AForge.NET Framework可以搜一下,网上例子很多)
  • 设计自己的相关页面,其中关键在于videoSourcePlayer。这是引用文件里的
  • 进行相关程序的编写,程序我放在后面。
  • 运行打包

实现效果

页面布局

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI5MTA5,size_16,color_FFFFFF,t_70#pic_center.jpg

点击连接,连接到自己电脑的摄像头

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI5MTA5,size_16,color_FFFFFF,t_70#pic_center.jpg

点击拍照,拍照成的图像,将保存在你防止的文件夹里。保存的文件夹在GetImagePath()函数里可以这样写
  1. <blockquote style="text-align: left;"><div style="text-align: left;">
  2.                private string GetImagePath()
  3.         {
  4.             string personImgPath = "D:\\图片";
  5.             if (!Directory.Exists(personImgPath))
  6.             {
  7.                 Directory.CreateDirectory(personImgPath);
  8.             }
  9.             return personImgPath;
  10.         }

命名(string picName = GetImagePath() + "\\" + "xiaosy" + ".jpg";)

重要代码
  1. <div style="text-align: left;">
  2.         private void btnConnect_Click(object sender, EventArgs e)
  3.         {
  4.             CameraConn();
  5.         }
  6.         //连接摄像头
  7.         private void CameraConn()
  8.         {
  9.             VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString);
  10.             videoSource.DesiredFrameSize = new System.Drawing.Size(320, 240);
  11.             videoSource.DesiredFrameRate = 1;
  12.             videoSourcePlayer.VideoSource = videoSource;
  13.             videoSourcePlayer.Start();
  14.         }
  15.         //关闭摄像头
  16.         private void btnClose_Click(object sender, EventArgs e)
  17.         {
  18.             videoSourcePlayer.SignalToStop();
  19.             videoSourcePlayer.WaitForStop();
  20.         }
  21.         //主窗体关闭
  22.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  23.         {
  24.             btnClose_Click(null, null);
  25.         }
  26.         //拍照
  27.         private void Photograph_Click(object sender, EventArgs e)
  28.         {
  29.             try
  30.             {
  31.                 if (videoSourcePlayer.IsRunning)
  32.                 {
  33.                     BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
  34.                                     videoSourcePlayer.GetCurrentVideoFrame().GetHbitmap(),
  35.                                     IntPtr.Zero,
  36.                                     Int32Rect.Empty,
  37.                                     BitmapSizeOptions.FromEmptyOptions());
  38.                     PngBitmapEncoder pE = new PngBitmapEncoder();
  39.                     pE.Frames.Add(BitmapFrame.Create(bitmapSource));
  40.                     string picName = GetImagePath() + "\" + "xiaosy" + ".jpg";
  41.                     if (File.Exists(picName))
  42.                     {
  43.                         File.Delete(picName);
  44.                     }
  45.                     using (Stream stream = File.Create(picName))
  46.                     {
  47.                         pE.Save(stream);
  48.                     }
  49.                     //拍照完成后关摄像头并刷新同时关窗体
  50.                     if (videoSourcePlayer != null && videoSourcePlayer.IsRunning)
  51.                     {
  52.                         videoSourcePlayer.SignalToStop();
  53.                         videoSourcePlayer.WaitForStop();
  54.                     }
  55.                     this.Close();
  56.                 }
  57.             }
  58.             catch (Exception ex)
  59.             {
  60.                 MessageBox.Show("摄像头异常:" + ex.Message);
  61.             }
  62.         }
  63.         private string GetImagePath()
  64.         {
  65.             string personImgPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)
  66.                          + Path.DirectorySeparatorChar.ToString() + "PersonImg";
  67.             if (!Directory.Exists(personImgPath))
  68.             {
  69.                 Directory.CreateDirectory(personImgPath);
  70.             }
  71.             return personImgPath;
  72.         }