Camera.cs 7.4 KB
using CameraVisionLib.Model;
using DocumentFormat.OpenXml.EMMA;
using DocumentFormat.OpenXml.Wordprocessing;
using IDHIKCamera;
using Model;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.ExceptionServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

namespace BLL
{
    public class Camera
    {
        public static bool useIDCamera = Config.Func_UseIDCamera;
        static Asa.Camera.VisionLib cameraVision;
        static string cameraName = null;
        public static void LoadCamera()
        {
            if (useIDCamera)
            {
                try
                {
                    cameraVision = new Asa.Camera.VisionLib(FilePath.CONFIG_CAMERA, false);
                    LibLogUtil.LogEvent += LibLogUtil_LogEvent;
                    IDHIK.Instance.Load();
                    List<string> names = IDHIK.Instance.cameraName;
                    IDHIK.Instance.DrawLine = false;

                    if (names != null)
                    {
                        // hikNameList.AddRange(names);
                        //foreach (string name in names)
                        //{
                        //    LogNet.log.Info("加载到IDHIK相机:" + name);
                        //}
                        cameraName = names.Find(s => s.Contains("ID"));
                        LogNet.log.Info("加载到扫码相机:" + cameraName);
                    }
                    //IDHIK.Instance.OpenAll();
                }
                catch (Exception ex)
                {
                    LogNet.log.Error("解析IDHIK出错:" + ex.StackTrace);
                }
            }
            else
            {
                cameraVision = new Asa.Camera.VisionLib(FilePath.CONFIG_CAMERA, BLLCommon.config.EnabledCamera);
                LogNet.log.Info("加载拍照相机,数量:" + cameraVision.Count);
            }
        }

        private static void LibLogUtil_LogEvent(LibLogEventArg libLogEventArg)
        {
            switch (libLogEventArg.Level)
            {
                case LibLogLevel.Debug:
                case LibLogLevel.Info:
                    LogNet.log.Info(libLogEventArg.Msg);
                    break;
                case LibLogLevel.Warning:
                    LogNet.log.Warn(libLogEventArg.Msg);
                    break;
                case LibLogLevel.Error:
                    LogNet.log.Error(libLogEventArg.Msg, libLogEventArg.Exception);
                    break;
            }
        }

        public static bool IsConnected()
        {
            if (useIDCamera)
            {
                bool rtn = !string.IsNullOrEmpty(cameraName);
                if (rtn)
                {
                    LogNet.log.Info("扫码相机已连接");
                }
                else
                    LogNet.log.Info("扫码相机未连接");
                return rtn;
            }
            else
            {
                LogNet.log.Info("相机数量为" + cameraVision.Count);
                return cameraVision.Count > 0;
            }
        }

        public static Bitmap[] Capture()
        {
            Bitmap[] result = new Bitmap[1];
            if (useIDCamera)
            {
                grabOne(out Bitmap bitmap);
                result[0] = bitmap;
            }
            else
            {
                cameraVision.Open();
                result = cameraVision.GetImage();
                cameraVision.Close();
            }
            return result;
        }
        public static Bitmap[] CaptureAndGetCode(out List<BarcodeInfo> barcodeInfos)
        {
            Bitmap[] result = new Bitmap[1];
            barcodeInfos = new List<BarcodeInfo>();
            if (useIDCamera)
            {
                barcodeInfos = grabOne(out Bitmap bitmap);
                if (bitmap==null)
                {
                    LogNet.log.Info("扫码相机获取图片为空!");
                }
                result[0] = bitmap;
                
            }
            else
            {
                cameraVision.Open();
                result = cameraVision.GetImage();
                for (int i = 0; i < result.Length; i++)
                {
                    if (result[i] != null)
                    {
                        barcodeInfos = Camera.GetBarCode(result[i]);
                        if (i != 0)
                        {
                            result[0]?.Dispose();
                            result[0] = result[i];
                        }
                    }
                }
                cameraVision.Close();
            }
            return result;
        }
        public static List<BarcodeInfo> GetBarCode(Bitmap bitmap)
        {
            return cameraVision.GetBarCode(bitmap);
        }
        public static void Dispose()
        {
            if (useIDCamera)
            {

            }
            else
            {
                cameraVision?.Dispose();
            }
        }
        public static void Open()
        {
            if (useIDCamera)
            {
                IDHIK.Instance.OpenAll();
            }
            else
            {
                cameraVision?.Open();
            }
        }
        public static void Close()
        {
            try
            {
                if (useIDCamera)
                {
                    IDHIK.Instance.CloseAll();
                }
                else
                {
                    cameraVision?.Close();
                }
            }catch (Exception ex)
            {
                LogNet.log.Error($"关闭相机失败 {ex}");
            }
        }
        public static string[] GetBarCodeText(List<BarcodeInfo> barcodeInfos)
        {
            List<string> list = new List<string>();
            for (int i = 0; i < barcodeInfos.Count; i++)
            {
                list.Add(barcodeInfos[i].Text);
            }

            return list.ToArray();
        }
        [HandleProcessCorruptedStateExceptions]
        static List<BarcodeInfo> grabOne(out Bitmap bitmap)
        {
            bitmap = null;
            List<BarcodeInfo> barcodeInfos = new List<BarcodeInfo>();
            if (string.IsNullOrEmpty(cameraName))
            {
                LogNet.log.Error($"{cameraName}名称为空!");
                return barcodeInfos;
            }
            try
            {
                bitmap = (Bitmap)IDHIK.Instance.GrabOne(cameraName, out List<CodeInfo> cc);
                if (cc != null)
                {
                    cc.ForEach(c =>
                    {
                        barcodeInfos.Add(new BarcodeInfo()
                        {
                            Center = new PointF(c.X, c.Y),
                            Angle = (float)c.Orientation,
                            CodeType = c.CodeType,
                            Text = c.CodeStr
                        });
                    });
                }
                if (bitmap == null)
                {
                    LogNet.log.Error($"{cameraName}:扫码相机获取图片为空" + cc.Count);
                }
            }
            catch (Exception e)
            {
                LogNet.log.Error($"{cameraName}取图失败:", e);
            }
            finally {
                //Close();
            }         
            return barcodeInfos;
        }
    }
}