C#实现调用摄像头,并拍照|8月更文挑战

2,717 阅读2分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

需求分析

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

前期准备

带摄像头的电脑

Visual Studio 2019

AForge.NET Framework库文件

设计流程

1.首先我们在Visual Studio 2019创建一个工程

2.添加引用文件(不会使用AForge.NET Framework可以搜一下,网上例子很多)

3.设计自己的相关页面,其中关键在于videoSourcePlayer。这是引用文件里的

进行相关程序的编写,程序我放在后面。

4.运行打包(下面有我打包好的软件,可以点击看看运行结果)

实现效果

整个的思路是先找到电脑上的摄像头设备,然后选择我们需要操作的设备,然后在拍照或者摄像。今天由于时间关系仅仅只是实现拍照,下次再做摄像的功能,实现之后也会一样分享在这里的,希望有需要的朋友关注。 当Form加载的时候,我们监听一下其Load事件,将检测到的摄像头设备添加到后边的ComboBox中供用户选择

页面布局

图片

图片

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

图片

图片

点击拍照,拍照成的图像,将保存在你防止的文件夹里。

保存的文件夹在 GetImagePath()函数里

可以这样写

                private string GetImagePath()
        {
      
            string personImgPath = "D:\\图片";
            if (!Directory.Exists(personImgPath))
            {
                Directory.CreateDirectory(personImgPath);
            }

            return personImgPath;
        }

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

操作摄像头以及实现拍照功能整个过程主要都是通过一个第三方的组件实现的,名字叫做AForge

在我们平时的使用中,摄像头程序还是非常常用的所以大家,还是要好好学习,在自己的设计中使用。

重要代码

图片

 `   private void btnConnect_Click(object sender, EventArgs e)
    {
        CameraConn();
       
    }`
 //连接摄像头
    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 Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        btnClose_Click(null, null);
    }

    //拍照
    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;
    }