BoxEquip_Camera.cs 3.1 KB
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    partial class BoxEquip
    {
        Thread[] camerathread;
        Asa.HIK.IPCamera camera;
        bool loadCameraState = false;
        public delegate void CameraAcqEventHandler(CameraArgs cameraArgs);
        public event CameraAcqEventHandler camera_event;
        void LoadCameraConfig(string id = "")
        {
            string path = @".\Config\box_Cameras.json";
            if (!File.Exists(path))
            {
                LogUtil.error(Name + "找不到监控相机配置文件" + path);
            }
            camera = new Asa.HIK.IPCamera(path);
            bool rtn = camera.Load();
            if (!rtn)
                LogUtil.error(Name + "加载监控相机配置文件失败");

            camerathread = new Thread[camera.Count];
            //pictureBox1.Image = bmp;
            loadCameraState = true;
        }
        void StartCamera()
        {
            for (int i = 0; i < camera.Count; i++)
            {
                camerathread[i] = new Thread(new ParameterizedThreadStart(startMonitor));
                camerathread[i].IsBackground = true;
                camerathread[i].Start(i);
            }
        }

        void startMonitor(object obj)
        {
            if (!loadCameraState)
            {
                LogUtil.error(Name + "监控相机初始化失败,无法开启");
                return;
            }
            int idx = (int)obj;
            var rtn = camera.Open(idx);
            if (!rtn)
                LogUtil.error(Name + "打开监控" + idx + "相机失败");

            while (camera.IsOpen[idx])
            {
                rtn = camera.GrabOne(idx, out Bitmap bmp);
                if (rtn)
                {
                    camera_event?.Invoke(new CameraArgs(idx, bmp));
                }
                Thread.Sleep(1000 / 10);
            }
        }
        void StopCamera()
        {
            for (int i = 0; i < camera.Count; i++)
            {
                try
                {
                    if (camera.IsOpen[i])
                    {
                        camera.Close(i);
                        camerathread[i].Join();
                    }
                }
                catch (Exception e)
                {
                    LogUtil.error($"关闭[{i}]相机失败", e);
                }
            }
            camera.Dispose();

        }
        public bool AcqImage(int idx,out Bitmap img)
        {
            return camera.GrabOne(idx, out img);
        }
    }
    public class CameraArgs : EventArgs
    {
        /// <summary>
        /// 相机序号
        /// </summary>
        public int Index { get; set; }
        /// <summary>
        /// 相机采集的图片
        /// </summary>
        public Bitmap Image { get; set; }
        public CameraArgs(int idx, Bitmap img)
        {
            Index = idx;
            Image = img;
        }
    }
}