C#操做摄像头 实现拍照功能

      从正式工做以来一直作的都是基于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;
            }
        }
View Code

      当用户选择某一摄像头设备再点击链接的时候,咱们打开摄像头,并对其进行初始化,关键代码:事件

//链接摄像头
        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();
        }
View Code

      当用户关闭点击关闭摄像头的时候,咱们作关闭的处理,代码:

//关闭摄像头
        private void btnClose_Click(object sender, EventArgs e)
        {
            videoSourcePlayer.SignalToStop();
            videoSourcePlayer.WaitForStop();
        }
View Code

      当用户点击拍照的时候,咱们获取摄像头当前的画面,并保存到设定的路径下,而后关闭当前窗口。关键代码:

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

      关闭以后,在bin目录下的PersonImg中便可找到保存的图片,固然,在程序中把该图片展现出来效果会更好,可是因为时间关系,就不添加了。须要的朋友能够本身实现,有问题的欢迎一块儿交流。

      至此,这样一个简单的拍照功能就完成了,在这里,附上源码下载地址。

      源码下载:http://download.csdn.net/detail/jrlxsy/6927833

      您的支持,是我分享的动力,谢谢!

相关文章
相关标签/搜索