无人地磅自助机开发总结(三)调用电脑本地摄像头拍照抓拍,添加水印

1.这个抓拍为静默抓拍,不展示抓拍画面,直接拍照片存到本地

2.Nuget引用AForge.Controls.dll

3.CameraHelper.cs

public static class CameraHelper
        {
            private static FilterInfoCollection _cameraDevices;
            private static VideoCaptureDevice div = null;
            private static VideoSourcePlayer sourcePlayer = new VideoSourcePlayer();
            private static bool _isDisplay = false;
            //指示_isDisplay设置为true后,是否设置了其他的sourcePlayer,若未设置则_isDisplay重设为false
            private static bool isSet = false;

            /// <summary>
            /// 获取或设置摄像头设备,无设备为null
            /// </summary>
            public static FilterInfoCollection CameraDevices
            {
                get
                {
                    return _cameraDevices;
                }
                set
                {
                    _cameraDevices = value;
                }
            }
            /// <summary>
            /// 指示是否显示摄像头视频画面
            /// 默认false
            /// </summary>
            public static bool IsDisplay
            {
                get { return _isDisplay; }
                set { _isDisplay = value; }
            }
            /// <summary>
            /// 获取或设置VideoSourcePlayer控件,
            /// 只有当IsDisplay设置为true时,该属性才可以设置成功
            /// </summary>
            public static VideoSourcePlayer SourcePlayer
            {
                get { return sourcePlayer; }
                set
                {
                    if (_isDisplay)
                    {
                        sourcePlayer = value;
                        isSet = true;
                    }

                }
            }
            /// <summary>
            /// 更新摄像头设备信息
            /// </summary>
            public static void UpdateCameraDevices()
            {
                _cameraDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            }
            /// <summary>
            /// 设置使用的摄像头设备
            /// </summary>
            /// <param name="index">设备在CameraDevices中的索引</param>
            /// <returns><see cref="bool"/></returns>
            public static bool SetCameraDevice(int index)
            {
                if (!isSet) _isDisplay = false;
                //无设备,返回false
                if (_cameraDevices.Count <= 0 || index < 0) return false;
                if (index > _cameraDevices.Count - 1) return false;
                // 设定初始视频设备
                div = new VideoCaptureDevice(_cameraDevices[index].MonikerString);
                sourcePlayer.VideoSource = div;
                div.Start();
                sourcePlayer.Start();
                return true;
            }
            /// <summary>
            /// 截取一帧图像并保存
            /// </summary>
            /// <param name="filePath">图像保存路径</param>
            /// <param name="fileName">保存的图像文件名</param>
            public static void CaptureImage()
            {

                ////连接摄像头
                //CameraHelper.UpdateCameraDevices();
                //if (CameraHelper.CameraDevices.Count > 0)
                //{
                //    CameraHelper.SetCameraDevice(0);
                //}

            if (sourcePlayer.VideoSource == null) return;
            string strDir = AppDomain.CurrentDomain.BaseDirectory + @"抓拍人脸_WMS\" + @"\" + DateTime.Now.ToString("yyyyMMdd");
           
            if (!Directory.Exists(strDir))
                {
                    Directory.CreateDirectory(strDir);
                }
                try
                {
                    //sourcePlayer.Start();

                    Image bitmap = sourcePlayer.GetCurrentVideoFrame();
                if (bitmap != null)
                {
                    //添加水印
                    using (var g = Graphics.FromImage(bitmap))
                    using (var brush = new SolidBrush(Color.White))
                    {
                        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        //var sizeF = g.MeasureString(text, font);
                        g.ResetTransform();
                        //g.TranslateTransform(p.X, p.Y);
                        //g.RotateTransform(44);
                        Font drawFont = new Font("Arial", 12);
                        float x = 20.0F;
                        float y = 20.0F;
                        // Set format of string.
                        StringFormat drawFormat = new StringFormat();
                        drawFormat.FormatFlags = StringFormatFlags.DisplayFormatControl;
                        g.DrawString(DateTime.Now.ToString("yyyy/MM/dd/HH:mm:ss"), drawFont, brush, x, y, drawFormat);
                    }
                }
                
                 string imgname = DateTime.Now.ToString("yyyyMMddHHmm") + Global.Carnum + ".jpg";
                 string jpgPath = strDir + @"\" + imgname;
                 Global.DriverjpgPath = jpgPath;
                 bitmap.Save(jpgPath);
                 bitmap.Dispose();
                //sourcePlayer.Stop();
                 //CloseDevice();
                }
                catch (Exception e)
                {
                MessageBox.Show(e.ToString());
                   Global.Notice = "拍摄设备故障,请联系工作人员:"+Global.Phone;
                   SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
                    if (Global.Times != null && Global.Times != "")
                    {
                        for (int i = 0; i < int.Parse(Global.Times); i++)
                        {
                            speechSynthesizer.Speak(Global.Notice);
                        }
                    }               
               
                }
            }
      
        /// <summary>
        /// 关闭摄像头设备
        /// </summary>
        public static void CloseDevice()
            {
                if (div != null && div.IsRunning)
                {
                    sourcePlayer.Stop();
                    div.SignalToStop();
                    div = null;
                    _cameraDevices = null;
                }
            }
        }

4.调用拍照类抓拍


//连接摄像头
CameraHelper.UpdateCameraDevices();
if (CameraHelper.CameraDevices.Count > 0)
{
CameraHelper.SetCameraDevice(0);
}

 

//抓拍人脸
CameraHelper.CaptureImage();

 
posted @ 2021-10-08 15:40  MrKing&  阅读(496)  评论(0编辑  收藏  举报