C#-Winform - 调用笔记本摄像头实现拍照并保存
文章目录
- C#-Winform - 调用笔记本摄像头实现拍照并保存
- 前言
- 一、创建新项目并引用DLL
- 添加途径
- 1、上网下载(免费)
- 2、管理NuGet程序包
- 二、C#程序编写
- 1.Winform页面编写
- 2.程序编写
- ① 首先创建所需要的定义
- ②扫描电脑,获取摄像头数据(名称以及分辨率)
- ③ 连接摄像头,并将画面反馈到vispShoot上
- ④ 拍照
- ⑤ 打开图片存储位置
- ⑥ 关闭相机以及退出关闭
前言
本次程序参考C#-Winform - 调用摄像头实现拍照 原创程序鹏
一、创建新项目并引用DLL
本文中必备的DLL:AForge
添加途径
1、上网下载(免费)
直接在官网上下载AForge.net库类官网下载地址
右击“引用”并选择“添加引用”,浏览选择出你所需要的DLL;
2、管理NuGet程序包
右击“引用”,选择“管理NuGet程序包”,在“浏览”中搜索“Aforge”并下载安装。
二、C#程序编写
1.Winform页面编写
添加控件,winform界面如下图所示。
2.程序编写
① 首先创建所需要的定义
代码如下(示例):
private FilterInfoCollection videoDevices;//所有摄像设备
private VideoCaptureDevice videoDevice;//摄像设备
private VideoCapabilities[] videoCapabilities;//摄像头分辨率
②扫描电脑,获取摄像头数据(名称以及分辨率)
代码如下(示例):
//程序运行时自动刷新private void Form1_Load(object sender, EventArgs e){videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);//得到机器所有接入的摄像设备if (videoDevices.Count != 0)//读取到摄像设备{foreach (FilterInfo device in videoDevices){cboVideo.Items.Add(device.Name);//把摄像设备添加到摄像列表中}}else{cboVideo.Items.Add("没有找到摄像头");}cboVideo.SelectedIndex = 0;//默认选择第一个if (videoDevices.Count != 0)//读取到摄像设备{//获取摄像头videoDevice = new VideoCaptureDevice(videoDevices[cboVideo.SelectedIndex].MonikerString);GetDeviceResolution(videoDevice);//获得摄像头的分辨率}}//获得摄像头的分辨率private void GetDeviceResolution(VideoCaptureDevice videoCaptureDevice){cboResolution.Items.Clear();//清空列表videoCapabilities = videoCaptureDevice.VideoCapabilities;//设备的摄像头分辨率数组foreach (VideoCapabilities capabilty in videoCapabilities){//把这个设备的所有分辨率添加到列表cboResolution.Items.Add($"{capabilty.FrameSize.Width} x {capabilty.FrameSize.Height}");}cboResolution.SelectedIndex = 0;//默认选择第一个}
③ 连接摄像头,并将画面反馈到vispShoot上
代码如下(示例):
private void btnConnect_Click(object sender, EventArgs e){if (videoDevice != null)//如果摄像头不为空{videoDevice.VideoResolution = videoCapabilities[cboResolution.SelectedIndex];//摄像头分辨率vispShoot.VideoSource = videoDevice;//把摄像头赋给控件vispShoot.Start();//开启摄像头EnableControlStatus(false);}}//控件的显示切换private void EnableControlStatus(bool status){cboVideo.Enabled = status;cboResolution.Enabled = status;btnConnect.Enabled = status;btnPic.Enabled = !status;btnCut.Enabled = !status;}
④ 拍照
代码如下(示例):
int i = 0;private void btnPic_Click(object sender, EventArgs e){if (vispShoot == null){return;}else{while(true){i++;//创建图像对象Bitmap img = vispShoot.GetCurrentVideoFrame();//拍照 picbPreview.Image = img;//img.Save(filename, ImageFormat.Jpeg);//这里可以根据情况,把照片存到某个路径下string filename;if (fname.Text !=null){//创建图片filename = fname.Text;}else{//创建图片filename = $"拍照{i}";}img.Save($"文件存储位置/{filename}.png");break;}}}
⑤ 打开图片存储位置
代码如下(示例):
private void saveadress_Click(object sender, EventArgs e){string filePath = @"文件存储位置";//文件(文件夹)路径System.Diagnostics.Process.Start(filePath);}
⑥ 关闭相机以及退出关闭
代码如下(示例):
private void btnCut_Click(object sender, EventArgs e){DisConnect();//断开连接EnableControlStatus(true);}//关闭并释放private void DisConnect(){if (vispShoot.VideoSource != null){vispShoot.SignalToStop();vispShoot.WaitForStop();vispShoot.VideoSource = null;}}private void Form1_FormClosing(object sender, FormClosingEventArgs e){DisConnect();//关闭并释放}