Camera.cs 5.0 KB
using Basler.Pylon;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeTest
{

    public class PylonCamera
    {
        private Camera cam = null;
        private List<ICameraInfo> allCameras;
        private PixelDataConverter conv = new PixelDataConverter();
        private Stopwatch stopWatch = new Stopwatch();
        private System.Windows.Forms.PictureBox pic;

        public PylonCamera()
        {
            allCameras = CameraFinder.Enumerate();
        }

        ~PylonCamera()
        {
            Close();
        }

        public int Index { set; get; }

        public string ErrInfo { set; get; }

        public int CameraCount
        {
            get { return allCameras.Count; }
        }

        public bool IsOpen
        {
            get { return cam != null; }
        }

        public string[] GetName()
        {
            string[] s = new string[allCameras.Count];
            for (int i = 0; i < s.Length; i++)
                s[i] = allCameras[i][CameraInfoKey.FullName].ToString();
            return s;
        }

        public void Close()
        {
            if (cam != null)
            {
                cam.Close();
                cam.Dispose();
                cam = null;
            }
        }

        public bool Open()
        {
            return Open(Index);
        }

        public bool Open(int idx)
        {
            if (idx < 0 || idx >= allCameras.Count) return false;
            if (cam != null) Close();

            try
            {
                Index = idx;
                cam = new Camera(allCameras[idx]);
                cam.ConnectionLost += OnConnectionLost;
                cam.CameraOpened += OnCameraOpened;
                cam.CameraClosed += OnCameraClosed;
                cam.StreamGrabber.GrabStarted += OnGrabStarted;
                cam.StreamGrabber.ImageGrabbed += OnImageGrabbed;
                cam.StreamGrabber.GrabStopped += OnGrabStopped;
                cam.Open();
              
                //加载用户设置1
                cam.Parameters[PLCamera.UserSetSelector].SetValue(PLCamera.UserSetSelector.UserSet1);
                //执行设置
                bool bln = cam.Parameters[PLCamera.UserSetLoad].TryExecute();
                return true;
            }
            catch (Exception ex)
            {
                ErrInfo = ex.Message;
                return false;
            }
        }

        public void Stop()
        {
            if (cam != null)
            {
                cam.StreamGrabber.Stop();
            }
        }

        
        public    Bitmap syncShot()
        {
            cam.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
            
            cam.StreamGrabber.Start();
            IGrabResult grabResult = cam.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
            if (!grabResult.IsValid)
            {
                return null;
            }

            Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
          
 
            cam.StreamGrabber.Stop();
            return bitmap;
        }
 
        public void asynShot( )
        {
            try
            { 
                cam.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
                cam.StreamGrabber.Start(1, GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
            }
            catch (Exception ex)
            {
                ErrInfo = ex.Message;
            }
        }

        public void ContinuousShot( )
        {
            try
            { 
                cam.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
                cam.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
            }
            catch (Exception ex)
            {
                ErrInfo = ex.Message;
            }
        }



        private void OnConnectionLost(Object sender, EventArgs e)
        {
            Close();
        }

        private void OnCameraOpened(Object sender, EventArgs e)
        {
        }

        private void OnCameraClosed(Object sender, EventArgs e)
        {
        }

        private void OnGrabStarted(Object sender, EventArgs e)
        {
            stopWatch.Reset();
        }

        private void OnGrabStopped(Object sender, GrabStopEventArgs e)
        {
            stopWatch.Reset();
        }

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

            if (!stopWatch.IsRunning || stopWatch.ElapsedMilliseconds > 33)
            {
                stopWatch.Restart();

            }
            Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);

        }
    }

}