AForge.net 使用之录像拍照功能实现
原文地址:http://blog.csdn.net/chenhongwu666/article/details/41965801
连接摄像头设备,这里需要引入
AForge.Video;
AForge.Video.DirectShow;
AForge.Video.FFMPEG;
还需要添加引用,aforge.dll,aforge.video,aforge.video.directshow,aforge.control,aforge.video.ffmpeg,
在工具箱中还需要添加AForge.Control,然后找到VideoSourcePlayer这个控件添加到界面上
然后定义变量
private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoSource;
private bool stopREC = true;
private bool createNewFile = true;
private string videoFileFullPath = string.Empty; //视频文件全路径
private string imageFileFullPath = string.Empty; //图像文件全路径
private string videoPath = @"E:\video\"; //视频文件路径
private string imagePath = @"E:\video\images\"; //图像文件路径
private string videoFileName = string.Empty; //视频文件名
private string imageFileName = string.Empty; //图像文件名
private string drawDate = string.Empty;
private VideoFileWriter videoWriter = null;
public delegate void MyInvoke(); //定义一个委托方法
string g_s_AutoSavePath = AppDomain.CurrentDomain.BaseDirectory + "Capture\\";
object objLock = new object(); //定义一个对象的锁
int frameRate = 20; //默认帧率
private Stopwatch stopWatch = null;
IVideoSource iVideoSource = null;
private void InitUI() { //连接 if (msc.OpenPort()) { msc.ConnectMicroScopeControl(); //开启摄像头 videoDevices = vh.GetDevices(); if (videoDevices != null && videoDevices.Count > 0) { videoSource = vh.VideoConnect(); } videoSourcePlayer1.VideoSource = videoSource; videoSourcePlayer1.Start(); } }
开始录像
private void btnStartVideotape_Click(object sender, EventArgs e) { //开始录像 if (btnStartVideotape.Text == "开始录像") { stopREC = false; frameRate = Convert.ToInt32(txtFrameRate.Text.Trim()); btnStartVideotape.Text = "停止录像"; } else if (btnStartVideotape.Text == "停止录像") { stopREC = true; btnStartVideotape.Text = "开始录像"; } }
添加aforge.net的一个VideoSourcePlayer控件之后找到NewFrame事件,代码如下:
下面是控件的一个事件,是真正录像的代码
private void videoSourcePlayer1_NewFrame(object sender, ref Bitmap image) { //录像 Graphics g = Graphics.FromImage(image); SolidBrush drawBrush = new SolidBrush(Color.Yellow); Font drawFont = new Font("Arial", 6, FontStyle.Bold, GraphicsUnit.Millimeter); int xPos = image.Width - (image.Width - 15); int yPos = 10; //写到屏幕上的时间 drawDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); g.DrawString(drawDate, drawFont, drawBrush, xPos, yPos); if (!Directory.Exists(videoPath)) Directory.CreateDirectory(videoPath); //创建文件路径 //fileFullPath = path + fileName; if (stopREC) { stopREC = true; createNewFile = true; //这里要设置为true表示要创建新文件 if (videoWriter != null) videoWriter.Close(); } else { //开始录像 if (createNewFile) { videoFileName = DateTime.Now.ToString("yyyy.MM.dd HH.mm.ss") + ".avi"; videoFileFullPath = videoPath + videoFileName; createNewFile = false; if (videoWriter != null) { videoWriter.Close(); videoWriter.Dispose(); } videoWriter = new VideoFileWriter(); //这里必须是全路径,否则会默认保存到程序运行根据录下了 videoWriter.Open(videoFileFullPath, image.Width, image.Height, frameRate, VideoCodec.MPEG4); videoWriter.WriteVideoFrame(image); } else { videoWriter.WriteVideoFrame(image); } } }
拍照代码
/// <summary> /// 手动拍照或抓图 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnCapture_Click(object sender, EventArgs e) { try { int number=0; number++; string fileImageName = g_s_RequestNo + "-" + number + ".bmp"; string fileCapturePath = g_s_AutoSavePath + g_s_RequestNo + "\\"; if (!Directory.Exists(fileCapturePath)) Directory.CreateDirectory(fileCapturePath); //抓到图保存到指定路径 Bitmap bmp = null; bmp = videoSourcePlayer1.GetCurrentVideoFrame(); if (bmp == null) { MessageBox.Show("捕获图像失败!", "提示"); return; } bmp.Save(fileCapturePath + fileImageName, ImageFormat.Bmp); } catch (Exception ex) { MessageBox.Show("捕获图像失败!" + ex.Message, "提示"); } }
最基本的工作就完成了,如果要更加完美的话还需要细化,优化等等,就先记录到此,以便记录自己的点点滴滴的进步
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。