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 ExposureSbControl : 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.strength.text");///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 ExposureSbControl() { 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(); } } else { btnLog_Click(null, null);//默认log 按下 cmbExpUnit.SelectedIndex = 1; UpdateTimeRange(); } } 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) { if (!ckbAutoExposure.Checked) { new Thread(() => { m_camera.AutoExposure = 1; m_camera.Target = value; Thread.Sleep(500); this.Invoke(new Action(OnTimerAutoExposure)); Thread.Sleep(500); this.Invoke(new Action(OnTimerAutoExposure)); m_camera.AutoExposure = 0; }).Start(); } else { _settings.Brightness = value; m_camera.Target = value; } } #region Exposure Range _expRange; private void InitializeExposure() { _expRange = m_camera.GetExposureTimeRange(); btnLog_Click(null, null);//默认log 按下 var value = m_camera.ExposureTime; cmbExpUnit.SelectedIndex = 1; UpdateTimeRange(); UpdateTimeDisplay(value); UpdateTimeBar(value); } /// /// 130us~100ms /// Range _rangeUs = new Range() { Min = 130, Max = 1000 }; /// /// 130us~2s /// Range _rangeMs = new Range() { Min = 130, Max = 1000000 }; /// /// 100ms~60s /// Range _rangeS = new Range() { Min = 1000/*ms*/, Max = 60000 /*ms*/}; double _log = 1.05; void UpdateTimeRange() { if (_isLog) { if (cmbExpUnit.SelectedIndex == 0) { tkbExposure.Minimum = (int)Math.Log(_rangeUs.Min, 1.05); tkbExposure.Maximum = (int)Math.Log(_rangeUs.Max, 1.05); lblExpMin.Text = _rangeUs.Min + "us"; lblExpMax.Text = _rangeUs.Max / 1000 + "ms"; } else if (cmbExpUnit.SelectedIndex == 1) { tkbExposure.Minimum = (int)Math.Log(_rangeMs.Min, 1.05); tkbExposure.Maximum = (int)Math.Log(_rangeMs.Max, 1.05); lblExpMin.Text = _rangeMs.Min + "us"; lblExpMax.Text = _rangeMs.Max / 1000000 + "s"; } else { tkbExposure.Minimum = (int)Math.Log(_rangeS.Min, 1.05); tkbExposure.Maximum = (int)Math.Log(_rangeS.Max, 1.05); lblExpMin.Text = _rangeS.Min / 1000 + "s"; lblExpMax.Text = _rangeS.Max / 1000 + "s"; } } else { if (cmbExpUnit.SelectedIndex == 0)//130us~1ms { tkbExposure.Minimum = (int)_rangeUs.Min; tkbExposure.Maximum = (int)_rangeUs.Max; lblExpMin.Text = _rangeUs.Min + "us"; lblExpMax.Text = _rangeUs.Max / 1000 + "ms"; } else if (cmbExpUnit.SelectedIndex == 1)//130us~1s { tkbExposure.Minimum = (int)_rangeMs.Min; tkbExposure.Maximum = (int)_rangeMs.Max; lblExpMin.Text = _rangeMs.Min + "us"; lblExpMax.Text = _rangeMs.Max / 1000000 + "s"; } else//1s~60s { tkbExposure.Minimum = (int)_rangeS.Min; tkbExposure.Maximum = (int)_rangeS.Max; lblExpMin.Text = _rangeS.Min / 1000 + "s"; lblExpMax.Text = _rangeS.Max / 1000 + "s"; } } } private void tkbExposure_Scroll(object sender, EventArgs e) { double value = tkbExposure.Value; if (_isLog) { if (cmbExpUnit.SelectedIndex == 0) { if (value == tkbExposure.Minimum) value = _rangeUs.Min; else if (value == tkbExposure.Maximum) value = _rangeUs.Max; else value = Math.Pow(_log, value); value /= 1000; } else if (cmbExpUnit.SelectedIndex == 1) { if (value == tkbExposure.Minimum) value = _rangeMs.Min; else if (value == tkbExposure.Maximum) value = _rangeMs.Max; else value = Math.Pow(_log, value); value /= 1000; } else if (cmbExpUnit.SelectedIndex == 2) { if (value == tkbExposure.Minimum) value = _rangeS.Min; else if (value == tkbExposure.Maximum) value = _rangeS.Max; else value = Math.Pow(_log, value); } } else { if (cmbExpUnit.SelectedIndex == 0) { value = value / 1000; } else if (cmbExpUnit.SelectedIndex == 1) { value = value / 1000; } else if (cmbExpUnit.SelectedIndex == 2) { } } Exposure_OnValueChange(value); UpdateTimeDisplay(value); } private void UpdateTimeDisplay(double value) { if (cmbExpUnit.SelectedIndex == 0) { txbExpTime.Text = (int)(value * 1000) + ""; } else if (cmbExpUnit.SelectedIndex == 1) { txbExpTime.Text = value.ToString("f2"); } else if (cmbExpUnit.SelectedIndex == 2) { txbExpTime.Text = (value / 1000).ToString("f2"); } } private void UpdateTimeBar(double value) { if (value == 0) return; Range range = _rangeMs; if (cmbExpUnit.SelectedIndex == 0) { range = _rangeUs; value *= 1000; } else if (cmbExpUnit.SelectedIndex == 1) { range = _rangeMs; value *= 1000; } else if (cmbExpUnit.SelectedIndex == 2) { range = _rangeS; } else { return; } value = Math.Max(range.Min, Math.Min(range.Max, value)); value = _isLog ? Math.Log(value, _log) : value; try { tkbExposure.Value = (int)value; } catch { } } private void Exposure_OnValueChange(double obj) { _settings.LNExposure = obj; m_camera.ExposureTime = obj; } private void Exposure_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Delete) { if (txbExpTime.Text.Contains(".")) e.Handled = true; return; } 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.ToDouble(txbExpTime.Text); if (cmbExpUnit.SelectedIndex == 0) { value = value / 1000; } else if (cmbExpUnit.SelectedIndex == 1) { } else if (cmbExpUnit.SelectedIndex == 2) { value = value * 1000; } value = Math.Min(_expRange.Max, Math.Max(_expRange.Min, value)); if (cmbExpUnit.SelectedIndex == 0) { txbExpTime.Text = (int)(value * 1000) + ""; } else if (cmbExpUnit.SelectedIndex == 1) { txbExpTime.Text = value.ToString("f2"); } else if (cmbExpUnit.SelectedIndex == 2) { txbExpTime.Text = (value / 1000).ToString("f2"); } 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 /// /// 刷新控件状态 /// public void UpdateDisplay() { var isAuto = _settings.ATExposure == 1; ckbAutoExposure.Checked = isAuto; tkbExposure.Enabled = !isAuto; txbExpTime.Enabled = !isAuto; cmpGain.Enabled = !isAuto; // cmpTarget.Enabled = isAuto; if (isAuto)//固定曝光 { OnTimerAutoExposure(); } } bool _isLog = false; private void btnLog_Click(object sender, EventArgs e) { _isLog = !_isLog; if (_isLog) { btnLog.BackColor = CommonDefine.Blue; btnLog.FlatStyle = FlatStyle.Flat; } else { btnLog.BackColor = SystemColors.Control; btnLog.FlatStyle = FlatStyle.Standard; } UpdateTimeRange(); OnTimerAutoExposure(); } private void cmbExpUnit_SelectedIndexChanged(object sender, EventArgs e) { UpdateTimeRange(); OnTimerAutoExposure(); } } }