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 /// /// 刷新控件状态 /// public void UpdateDisplay() { var isAuto = _settings.ATExposure == 1; ckbAutoExposure.Checked = isAuto; pnlExposure.Enabled = !isAuto; cmpGain.Enabled = !isAuto; if (isAuto)//固定曝光 { OnTimerAutoExposure(); } } } }