BaslerCManager.cs 5.4 KB
using Basler.Pylon;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeLibrary
{
    public class BaslerCManager
    {

        /// <summary>
        /// 当前相机
        /// </summary>
        //  private Camera cameraCur = null;
        private static Dictionary<string, BaslerCameraBean> cameraMap = new Dictionary<string, BaslerCameraBean>();
        /// <summary>
        /// 所有相机列表
        /// </summary>
        private static List<ICameraInfo> cameraAll;
        /// <summary>
        /// 所有相机的名称
        /// </summary>
        private static List<string> cameraName;
        /// <summary>
        /// 获取连续图像
        /// </summary>
        public delegate void GrabImageEvent();
        ///// <summary>
        ///// 获取连续图像事件,需要跨线程操作
        ///// </summary>
        //public event GrabImageEvent GrabImage;

        private BaslerCManager()
        {
            Load();
        }

        /// <summary>
        /// 错误信息
        /// </summary>
        public static string ErrInfo { set; get; }

        /// <summary>
        /// 相机总数
        /// </summary>
        public int Count
        {
            get { return cameraAll == null ? 0 : cameraAll.Count; }
        }

        /// <summary>
        /// 相机名称,ModelName,SerialNumber
        /// </summary>
        public static string[] CameraName
        {
            get
            {
                if (cameraName == null)
                {
                    cameraName = new List<string>();
                }
                return cameraName.ToArray();
            }
        }

        public static BaslerCameraBean GetCamera(string cName)
        {
            if (cameraMap.ContainsKey(cName))
            {
                return cameraMap[cName];
            }
            return null;
        }
        public static void AddCamera(string name, BaslerCameraBean bean)
        {
            if (cameraMap.ContainsKey(name))
            {
                cameraMap.Remove(name);
            }
            cameraMap.Add(name, bean);
        }
        /// <summary>
        /// 当前相机是否打开
        /// </summary>
        public static bool IsOpen(string name)
        {
            BaslerCameraBean bean = GetCamera(name);
            if (bean == null)
            { return false; }
            else
            {
                return bean.cameraCur.IsOpen;
            }
        }



        /// <summary>
        /// 加载相机
        /// </summary>
        public static void Load()
        {
            try
            {
                cameraAll = CameraFinder.Enumerate();
                cameraName = new List<string>();
                foreach (ICameraInfo info in cameraAll)
                    cameraName.Add(info[CameraInfoKey.ModelName].ToString() + " (" + info[CameraInfoKey.SerialNumber].ToString() + ")");
            }
            catch (Exception ex)
            {
                HDLogUtil.error("Basler Load Error:" + ex.StackTrace);
            }
        }

        /// <summary>
        /// 打开指定相机
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static bool Open(string name, GrabImageEvent grab=null)
        {
            int n = cameraName.FindIndex(s => s == name);
            if (n == -1)
                return false;
            else
            {
                if (cameraMap.ContainsKey(name))
                {
                    if (cameraMap[name].cameraCur != null)
                    {
                        cameraMap[name].cameraCur.Close();
                    }
                    cameraMap.Remove(name);
                }
                Camera cameraCur = null;
                if (n < 0 || n >= cameraAll.Count) { return false ; } 
                try
                {
                    cameraCur = new Camera(cameraAll[n]);
                    BaslerCameraBean bean = new BaslerCameraBean(cameraCur);
                    bean.Open( ); 
                    AddCamera(name, bean);
                }
                catch (Exception ex)
                {
                    ErrInfo = ex.Message;
                    return false ;
                }
                return true;
            }
        }

        /// <summary>
        /// 关闭当前相机
        /// </summary>
        public static void Close(string name)
        {
            BaslerCameraBean bean = GetCamera(name);
            if (bean != null && bean.cameraCur != null)
            {
                bean.Close();
            }
        }
        public static void CloseAll()
        {
            foreach(string key in cameraMap.Keys)
            {
                Close(key);
            }
        }
        /// <summary>
        /// 停止抓取数据
        /// </summary>
        public static void Stop(string name)
        {
            BaslerCameraBean bean = GetCamera(name);
            if (bean != null)
            {
                bean.Stop();
            }
        }

        /// <summary>
        /// 抓取一张图像
        /// </summary>
        public static Bitmap GrabOne(string name)
        {
            BaslerCameraBean bean = GetCamera(name);
            if (bean != null && bean.cameraCur != null)
            {
                return bean.GrabOne();
            }
            return null; 
        } 
    }
}