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, "提示");

    }

}

最基本的工作就完成了,如果要更加完美的话还需要细化,优化等等,就先记录到此,以便记录自己的点点滴滴的进步

你可能感兴趣的:(.net)