BaslerCameraBean.cs 5.3 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;
using static CodeLibrary.BaslerCamera;

namespace CodeLibrary
{
   public  class BaslerCameraBean
    {
        public   Camera cameraCur = null;
        /// <summary>
        /// 相机图像宽度
        /// </summary>
        public int Width { set; get; }

        /// <summary>
        /// 相机图像高度
        /// </summary>
        public int Height { set; get; }

        /// <summary>
        /// 相机32位缓存
        /// </summary>
        public byte[] Buffer { get; private set; }

        /// <summary>
        /// 相机32位图像
        /// </summary>
        public Bitmap Image { get; private set; }
        /// <summary>
        /// 获取连续图像事件,需要跨线程操作
        /// </summary>
        public event GrabImageEvent GrabImage;
        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErrInfo { set; get; }
        public BaslerCameraBean (Camera c)
        {
            this.cameraCur = c;
        }
        public BaslerCameraBean (Camera c ,int width,int height)
        {
            this.cameraCur = c;
            this.Width = width;
            this.Height = height;
        }
        public void Open()
        {
            cameraCur.StreamGrabber.ImageGrabbed += OnImageGrabbed;
            //cameraCur.StreamGrabber.GrabStopped += OnGrabStopped;
            cameraCur.Open();
            int Width = Convert.ToInt32(cameraCur.Parameters[PLCamera.Width].GetValue());
            int Height = Convert.ToInt32(cameraCur.Parameters[PLCamera.Height].GetValue());
            cameraCur.Parameters[PLCamera.UserSetSelector].SetValue(PLCamera.UserSetSelector.UserSet1);  //加载用户设置1
            bool bln = cameraCur.Parameters[PLCamera.UserSetLoad].TryExecute();  //执行设置 
        }
        /// <summary>
        /// 关闭当前相机
        /// </summary>
        public void Close()
        {
            if (cameraCur != null)
            {
                cameraCur.Close();
                cameraCur.Dispose();
                cameraCur = null;
            }
        }

        /// <summary>
        /// 停止抓取数据
        /// </summary>
        public void Stop()
        {
            if (cameraCur != null)
                cameraCur.StreamGrabber.Stop();
        }

        /// <summary>
        /// 抓取一张图像
        /// </summary>
        public Bitmap GrabOne()
        {
            cameraCur.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);

            //cameraCur.StreamGrabber.Start();
            //IGrabResult grabResult = cameraCur.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
            IGrabResult grabResult = cameraCur.StreamGrabber.GrabOne(5000);

            if (!grabResult.IsValid) return null ;

            Image = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
            BitmapData bmpData = Image.LockBits(new Rectangle(0, 0, grabResult.Width, grabResult.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
            IntPtr ptrBmp = bmpData.Scan0;
            int picSize = bmpData.Stride * grabResult.Height;

            PixelDataConverter conv = new PixelDataConverter();
            conv.OutputPixelFormat = PixelType.BGRA8packed;
            conv.Convert(ptrBmp, picSize, grabResult);
            Buffer = new byte[picSize];
            System.Runtime.InteropServices.Marshal.Copy(ptrBmp, Buffer, 0, picSize);
            Image.UnlockBits(bmpData);
            return Image;
            //cameraCur.StreamGrabber.Stop();
        }

        /// <summary>
        /// 抓取连续图像,触发GrabImage事件
        /// </summary>
        public void GrabContinuous()
        {
            cameraCur.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
            cameraCur.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
        }

        private void OnImageGrabbed(object sender, ImageGrabbedEventArgs e)
        {
            try
            {
                IGrabResult grabResult = e.GrabResult;
                if (!grabResult.IsValid) return;

                Image = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
                BitmapData bmpData = Image.LockBits(new Rectangle(0, 0, grabResult.Width, grabResult.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
                IntPtr ptrBmp = bmpData.Scan0;
                int picSize = bmpData.Stride * grabResult.Height;

                PixelDataConverter conv = new PixelDataConverter();
                conv.OutputPixelFormat = PixelType.BGRA8packed;
                conv.Convert(ptrBmp, picSize, grabResult);
                Buffer = new byte[picSize];
                System.Runtime.InteropServices.Marshal.Copy(ptrBmp, Buffer, 0, picSize);
                Image.UnlockBits(bmpData);

                GrabImage?.Invoke();
            }
            catch (Exception ex)
            {
                ErrInfo = ex.Message;
            }
            finally
            {
                e.DisposeGrabResultIfClone();
            }
        }

    }
}