| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 | using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using PaintDotNet.Base.SettingModel;using System.Threading;using PaintDotNet.Camera;using PaintDotNet.ImageCollect;namespace PaintDotNet.Preview2{    public partial class ExposureControl : UserControl    {        private ICamera m_camera=>CameraManager.CurrentCamera;        private CameraParamModel.ParameterSets _settings        {            get            {                return CameraConfigs.Settings;            }        }        private double _exposureValue;        private void InitializeLanguageText()        {            this.cmpTarget.Caption = PdnResources.GetString("Menu.Exposurepercentage.text");            lblExposure.Text = PdnResources.GetString("Menu.timeofexposure.text");            this.groupBox1.Text = PdnResources.GetString("Menu.timeofexposure.text");            this.ckbAutoExposure.Text = PdnResources.GetString("Menu.auto-exposure.text");            this.btnAutoExposureOnce.Text = PdnResources.GetString("Menu.Oneautomaticexposure.Text");            this.groupBox2.Text = PdnResources.GetString("Menu.Gainvalueadjustment.text");            this.cmpGain.Caption = PdnResources.GetString("Menu.imagecapture.adjust.Gain.text");        }        public ExposureControl()        {            InitializeComponent();        }        public void Initialize()        {            InitializeLanguageText();            if (m_camera.IsOpen())            {                ckbAutoExposure.Checked = m_camera.AutoExposure == 1;// _settings.ATExposure == 1;                InitializeExposure();                // 亮度                Range range = m_camera.GetTargetRange();                cmpTarget.Max = (int)range.Max;                cmpTarget.Min = (int)range.Min;                cmpTarget.OnValueChange += CmpTarget_OnValueChange;                cmpTarget.Tag = range;                cmpTarget.Value = m_camera.Target;                //增益                range = m_camera.GetGlobalGainRange();                cmpGain.Max = (int)range.Max;                cmpGain.Min = (int)range.Min;                cmpGain.IsRangeVisible = false;                cmpGain.OnValueChange += CmpGain_OnValueChange;                cmpGain.Value = m_camera.Gain;                if (ckbAutoExposure.Checked)                {                    SetAutoExposure();                }                else                {                    SetFixedExposure();                }            }        }        public void UpdateSettings()        {            ckbAutoExposure.Checked = _settings.ATExposure == 1;            cmpTarget.Value = m_camera.Target;            var value = m_camera.ExposureTime;            cmpGain.Value = m_camera.Gain;            UpdateTimeDisplay(value);            UpdateTimeBar(value);        }        private void CmpGain_OnValueChange(int value)        {            m_camera.Gain = value;            _settings.GlobalGain = value;        }        private void CmpTarget_OnValueChange(int value)        {            _settings.GlobalGain = value;            m_camera.Target = value;        }        #region Exposure        private void InitializeExposure()        {            Range range = m_camera.GetExposureTimeRange();            tkbExposure.Tag = range;            tkbExposure.Minimum = (int)Math.Log(range.Min * 1000, 1.1);            tkbExposure.Maximum = (int)Math.Log(range.Max * 1000, 1.1);//毫秒转微秒            var value = m_camera.ExposureTime;            UpdateTimeDisplay(value);            UpdateTimeBar(value);        }        private void tkbExposure_Scroll(object sender, EventArgs e)        {            double value = tkbExposure.Value;            Range rang1 = tkbExposure.Tag as Range;            if (value == tkbExposure.Minimum) value = rang1.Min;            else if (value == tkbExposure.Maximum) value = rang1.Max;            else value = Math.Pow(1.1, value) / 1000;//微秒转毫秒            Exposure_OnValueChange(value);            UpdateTimeDisplay(value);        }        private void UpdateTimeDisplay(double value)        {            txbUs.Text = (int)(value * 1000) % 1000 + "";            txbMs.Text = (int)(value % 1000) + "";            txbS.Text = (int)(value / 1000) % 1000 + "";        }        private void UpdateTimeBar(double value)        {            if (value == 0)                return;            int value1 = (int)Math.Log(value * 1000, 1.1);            tkbExposure.Value = Math.Min(Math.Max(value1, tkbExposure.Minimum), tkbExposure.Maximum);        }        private void Exposure_OnValueChange(double obj)        {            _settings.LNExposure = obj;            m_camera.ExposureTime = obj;        }        private void Exposure_KeyPress(object sender, KeyPressEventArgs e)        {            if (!char.IsDigit(e.KeyChar) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Back))  // 非数字键, 放弃该输入            {                e.Handled = true;                return;            }            if (e.KeyChar == (char)Keys.Enter)            {                try                {                    double value = Convert.ToInt32(txbUs.Text);                    value += Convert.ToInt32(txbMs.Text) * 1000;                    value += Convert.ToInt32(txbS.Text) * 1000 * 1000;                    value /= 1000;                    var range = tkbExposure.Tag as Range;                    value = Math.Min(range.Max, Math.Max(range.Min, value));                    UpdateTimeDisplay(value);                    UpdateTimeBar(value);                    Exposure_OnValueChange(value);                }                catch (Exception ex)                {                    MessageBox.Show(ex.Message);                }            }        }        #endregion        #region Auto/Fixed Exposure        public void OnTimerAutoExposure()        {            _exposureValue = m_camera.ExposureTime;            cmpGain.Value = m_camera.Gain;            UpdateTimeDisplay(_exposureValue);            UpdateTimeBar(_exposureValue);        }        private void ckbAutoExposure_Click(object sender, EventArgs e)        {            var isAuto = ckbAutoExposure.Checked;            if (isAuto)            {                SetAutoExposure();            }            else            {                SetFixedExposure();            }        }        private void btnAutoExposureOnce_Click(object sender, EventArgs e)        {            SetAutoExposure();            ckbAutoExposure.Checked = false;            new Thread(() =>            {                Thread.Sleep(1000);                SetFixedExposure();                this.Invoke(new Action(OnTimerAutoExposure));            }).Start();        }        void SetAutoExposure()        {            _settings.ATExposure = 1;            m_camera.AutoExposure = 1;            //自动曝光恢复默认Gain(增益)            var defGain = 0;            m_camera.Gain = defGain;        }        void SetFixedExposure()        {            _settings.ATExposure = 0;            m_camera.AutoExposure = 0;            _settings.LNExposure = m_camera.ExposureTime;        }        #endregion        /// <summary>        /// 刷新控件状态        /// </summary>        public void UpdateDisplay()        {            var isAuto = _settings.ATExposure == 1;            ckbAutoExposure.Checked = isAuto;            pnlExposure.Enabled = !isAuto;            cmpGain.Enabled = !isAuto;            if (isAuto)//固定曝光            {                OnTimerAutoExposure();            }        }    }}
 |