前言:盼呀盼,实验室终于放暑假啦,虽然只有10天假,感觉还是很美滋滋哒。在家啥事儿没干,吃饭睡觉玩手机,渡过了两三天,终于找回点干劲。上次更新貌似已经是过年期间的事情了,当时写了几篇但是没有多少童鞋看,就有点松懈了,再次打开的时候很惊喜,涨粉儿啦,有赞有私信啦,嘎嘎嘎,感谢大家的支持与肯定~
这两天我打算把上学期用C#做界面时,感觉有所收获的部分,整理出来,写成前面一样的入门文档,希望能够给阅读我的文档的童鞋带来一点点帮助~
提纲:用c#实现一个拍照的功能程序,下面将给出实验效果和实现方法。

一、实验效果
1.运行程序

程序首先将检测本机的视频设备,若有多个视频设备,点击红色下拉框可以选择切换;若本机没有视频设备,将在最下方的文本框给出异常提示信息。
2.连接摄像头

点击程序界面的“连接摄像头”按钮,按钮上的文字将变成“关闭摄像头”,同时视频播放框将选定的摄像头捕捉到的图像内容播放出来。
3.拍照

点击“拍照”按钮,将视频框中当前的图像捕捉下来,保存为图片,并在右边的图片框中显示出来。
4.关闭摄像头

点击“关闭摄像头”按钮,按钮上的文字会变成“连接摄像头”,同时将摄像头关闭,视频播放框中不再右视频显现。
5.查看照片

拍摄的照片存放在程序的bin\debug文件夹下的image文件夹中,打开该文件夹即可查看。
二、实现步骤
本程序在《Step by step:一起来学C# (2)》给出的程序基础上进行编写。下面将从使用的外部控件的下载、引用、程序功能实现几个方面,介绍实现本功能程序的详细步骤。
1.下载AForge库
AForge目前更新到2.2.5版了,下载地址为:http://www.aforgenet.com/news/2013.07.17.releasing_framework_2.2.5.html。这个网页打开有些慢,下载得到的库文件之后将与程序一起给出。有想要自己下载的小伙伴可以按照下面的步骤尝试一下~
(1)浏览器中打开下载链接

在下载网页找到如红色框中的“downloads”,点击这个蓝色的单次链接,跳转到资源下载界面。
(2)选择下载的文件

在下载界面,选择要下载的文件,我们这边选择的是“Download Libraries only”,仅下载库文件。
(3)查看下载得到的库文件

解压下载到的文件,在AForge.NET Framework-2.2.5-(libs only)\Release文件夹下可以看到之后要使用的库文件。
2.添加对AForge的相关引用
我们主要需要引用:“AForge.dll”、“AForge.Controls.dll”、“AForge.Imaging.dll”、“AForge.Video.dll”、“AForge.Video.DirectShow.dll”五个库文件。
本小节下面的内容是添加对AForge部分使用到的库的引用的详细步骤,对这部分比较熟悉的小伙伴可以直接跳过,阅读第3个步骤哟~
(1)进入引用管理器

在VS右侧解决方案处,找到“引用”标签,右击“引用”,然后左键单击“添加引用”,即可进入引用管理器。
(2)在引用管理器选择要引用的文件

在引用管理器中,点击“浏览”按钮,然后选择要添加的库文件。

此处以引用“AForge.dll”库文件为例,说明引用过程。在“选择要引用的文件”界面,进入之前下载并解压的AForge库文件夹下的Release子文件夹,选中“AForge.dll”文件,点击“添加”按钮。

选择好要引用的库文件之后,在引用管理器界面便可以看到多了一行“AForge.dll”并打上了钩,点击“确定”即可完成引用添加。
(3)查看新增引用

添加引用之后,就可以在解决方案的引用标签下看到新增的库文件啦~
(4)按照上面的方法完成引用的添加

本节开头给出了5个要引用的库文件,按照上面的方法,一一引用进来,添加完引用之后,应当如图6给出的图片,至此添加引用的步骤完成啦。
(5)查看添加引用对工程带来的变化

添加引用给工程带来啥变化呢?我们添加完引用之后,点击一下“启动”(不点击“启动”编译运行一下,看不到变化哦~),然后我们再进入工程文件夹下的bin\dehug文件夹,会发现我们引用的库文件全部被自动添加到这个文件夹下了。
3.添加AForge中的视频播放控件
本功能程序中,我们要使用到AForge给出的一个控件VideoSourcePlayer,这个控件在工具箱中,默认是不包含的,需要我们自己添加进工具箱,该控件位于刚刚引用的“AForge.Controls.dll”库文件中。
下面将介绍如何在工具箱中添加一个控件,对于这部分比较熟悉的小伙伴可以跳过第3步骤下面的内容啦~
(1)添加一个选项卡

添加一个选项卡,之后将新添加的控件就放到该选项卡下,找控件的时候方便一些。(这个步骤不是必须哒,只是让工具箱里的控件emm清爽一些~)
(2)打开选择工具箱项界面

接下来我们在新建的“AForge”选项卡下面添加控件:右击“AForge”选项卡->点击“选择项”。这时选择工具箱项的界面会弹出,如下面的图3.
(3)浏览添加.Net Framework组件

在“选择工具箱项”界面,点击“浏览”按钮,打开写有控件的库文件。

选择“AForge.Controls.dll”库文件,点击“打开”按钮。

点击“打开”按钮之后,可能会弹出这个安全警告,点击“是”就OK,亲测无毒。。。。

然后我们看一下“选择工具箱项”界面,.Net Framework组件中是否有VideoSourcePlayer(在比较下面的位置,需要拖动一下右边的emm滑动条儿(忘了这玩意儿叫啥)),然后点击“确定”按钮。
(4)尝试将添加的控件拖到界面

添加完控件,我们在工具箱->“AForge”标签下面就可以看到导入的控件了。我们尝试一下,把“VideoSourcePlayer”控件拖到Form界面。(方法在之前的文章中提过,点住控件不放,一直拖到Form界面上即可)

拖完之后,我们便可以看到界面上多了一个其貌不扬方框(红色方框圈出来的),这就是我们之后要用的“VideoSourcePlayer”控件。
4.拖一个c#界面
下面我们先布置一下程序的前台界面,就是简单的控件拖拽,然后设置一下控件的属性,设置属性的方法在《Step by step:一起来学C# (2)》和《Step by step:一起来学C# (4)》中有简要说明,需要的话可以参考一下哦~
(1)拖控件得到一个C#程序界面
拖出来的界面如图1 拖界面所示,图中给出了使用到的控件名称,直接去工具箱里找一下拉过来就OK,界面布置大概一致就行,大小、位置不过多纠结。

(2)将来程序的后台代码注释或删除掉
因为是使用之前《Step by step:一起来学C# (2)》中的程序,原先有一部分代码,在本程序中就没有用处了,可以注释掉或删掉。这边是简单将原来的“点我吧”按钮改成了“连接摄像头”按钮,双击界面上的“连接摄像头”按钮,将原来的程序删掉或注释掉,然后我们再开始功能程序的编写。

5.后台代码编写
终于到了编写代码的步骤了,激动~
(1)添加窗口变量声明

进入代码编写,在Form类里面添加变量声明,这边需要使用到一个视频设备集合的变量,声明方法如图。
(2)添加Form_load代码
我们要实现一个在窗体加载时,检测摄像头设备,并且将设备名称加入到下拉框comboBox的项中的功能,而窗体加载功能是在Form_load中完成的。

我们回到窗口界面,双击红色方框圈出的区域的一个点,c#会自动生成Form1_Load函数,我们在这个函数中添加功能代码即可,添加的代码如下图3。

注意:我们编写程序时常常会遇到下面的错误信息提示:“未能找到类型或命名空间名称...”
解决的方法如下:右击下面划有红色浪线的字段如图4中的“FilterInfoCollection”;选择解析;然后选择using引用。这个操作实际上就是在程序文件开头,添加了一行“using AForge.Video.DirectShow;”
如果右击没有解析选项,说明相应的库文件没有被添加到工程中,需要找到相应的库文件,使用第2步中的流程添加库文件引用。


运行测试:填写好代码时候,我们点击“启动”,运行测试一下。

运行程序结果如下,选择视频设备后面的下拉框中,自动显现检测到的我的笔记本电脑的摄像头。

(3)实现摄像头连接与断开功能
退出运行测试,下面我们编写连接摄像头部分的代码,首先双击界面上的“连接摄像头”,编写该按钮的响应程序。

添加的程序如下图:

我们点击VS的“启动”按钮,测试一下编写好的程序。点击界面上的“连接摄像头”按钮,按钮上的字就变成了“关闭摄像头”,同时“VideoSourcePlayer”控件中播放出摄像头捕捉到的画面。

点击“图11”中的“关闭摄像头按钮”,按钮上的文字变成“连接摄像头”,同时“VideoSourcePlayer”控件中不再显示画面,摄像头停止工作。

(4)实现拍照功能
播放了摄像头画面我们已经成功了一大步,下面要添加拍照功能,即点击“拍照”按钮,定格“VideoSourcePlayer”控件中的一帧画面,在图片框中显示,同时生成图片存到本地。
我们在工程文件下bin\debug文件夹下新建一个“image”文件夹,用于存储拍摄的图片。

然后双击界面上的“拍照按钮”,进入“拍照”按钮响应程序的编写。

在函数中添加如下代码:

至此,程序功能便实现了,下面是测试界面,点击拍照,右边的图片框便定格一帧画面。此时打开bin\debug\image文件夹,会发现下面有刚刚拍摄下来的照片。

工程文件将在下面评论中给出链接,供大家参考,省的没调出来影响情绪哈~
文档有不够清楚和错误的地方欢迎留言指出,一起进步~
网友评论
AFor个库链接:链接:https://pan.baidu.com/s/1Cz3nxn2CLVlp7b72XxYUyg 密码:3se6