需求:由于项目需要获得用户的头像,所以需要用C#调用摄像头获取头像。
下面写一个调用摄像头的方法
案例:调用摄像头的一个DEMO【效果图】
使用的类库:AForge.dll 【Demo下载,Demo里面有类库】
1、检测电脑上的摄像头设备
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
用Count判断摄像头设备的个数,如果没有摄像头,则抛出异常【自行处理异常】,有摄像头,则添加到下拉框中
if (videoDevices.Count == 0) throw new ApplicationException(); foreach (FilterInfo device in videoDevices) { tscbxCameras.Items.Add(device.Name); }
2、连接摄像头
检测到摄像头,就可以开始连接摄像头,获取图像啦。
//选择下拉框中的一个摄像头设备 VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString); //设置获取显示图像框的大小 videoSource.DesiredFrameSize = new Size(320, 240); videoSource.DesiredFrameRate = 1; //为摄像头控件设置摄像头获取的图片 videPlayer.VideoSource = videoSource; //开启摄像头 videPlayer.Start();
3、关闭摄像头【也可以用 Stop() 方法关闭】
videPlayer.SignalToStop();
videPlayer.WaitForStop();
Demo运行截图:
项目中,多了一个截图:把摄像头上的图片绘制下来
img = new Bitmap(102, 126, PixelFormat.Format24bppRgb); //设置图片的大小,位数 videPlayer.DrawToBitmap((Bitmap)img, new Rectangle(0, 0, videPlayer.Width, videPlayer.Height)); //绘制图像到Img对象 videPicture.Image = img; //显示到PictureBox控件上
在这里遇到过一个问题,那就是 GDI+一般性错误【原因:资源占用】
遇到问题的情况:
1、修改人员信息的时候,先从本地读取图片文件,赋值到PictureBox上。
2、保存的时候会再把PictureBox的图片保存到本地硬盘中。
解决办法: 【解除图片资源占用即可】
1、把本地图片读取出来,深复制一份
2、把深复制的那一份赋值到PictureBox
3、关闭本地图片资源的关闭
#region 深复制图片,并且关闭资源,防止出现占用 //图片的深复制,并且关闭占用图片文件的资源 img = new Bitmap(path); Image bmp = new Bitmap(img.Width, img.Height); Graphics draw = Graphics.FromImage(bmp); draw.DrawImage(img, 0, 0); draw.Dispose(); img.Dispose(); videPicture.Image = bmp; #endregion
项目中使用截图: