ExposureControl.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using PaintDotNet.Base.SettingModel;
  11. using System.Threading;
  12. using PaintDotNet.Camera;
  13. using PaintDotNet.ImageCollect;
  14. namespace PaintDotNet.Preview2
  15. {
  16. public partial class ExposureControl : UserControl
  17. {
  18. private ICamera m_camera=>CameraManager.CurrentCamera;
  19. private CameraParamModel.ParameterSets _settings
  20. {
  21. get
  22. {
  23. return CameraConfigs.Settings;
  24. }
  25. }
  26. private double _exposureValue;
  27. private void InitializeLanguageText()
  28. {
  29. this.cmpTarget.Caption = PdnResources.GetString("Menu.Exposurepercentage.text");
  30. lblExposure.Text = PdnResources.GetString("Menu.timeofexposure.text");
  31. this.groupBox1.Text = PdnResources.GetString("Menu.timeofexposure.text");
  32. this.ckbAutoExposure.Text = PdnResources.GetString("Menu.auto-exposure.text");
  33. this.btnAutoExposureOnce.Text = PdnResources.GetString("Menu.Oneautomaticexposure.Text");
  34. this.groupBox2.Text = PdnResources.GetString("Menu.Gainvalueadjustment.text");
  35. this.cmpGain.Caption = PdnResources.GetString("Menu.imagecapture.adjust.Gain.text");
  36. }
  37. public ExposureControl()
  38. {
  39. InitializeComponent();
  40. }
  41. public void Initialize()
  42. {
  43. InitializeLanguageText();
  44. if (m_camera.IsOpen())
  45. {
  46. ckbAutoExposure.Checked = m_camera.AutoExposure == 1;// _settings.ATExposure == 1;
  47. InitializeExposure();
  48. // 亮度
  49. Range range = m_camera.GetTargetRange();
  50. cmpTarget.Max = (int)range.Max;
  51. cmpTarget.Min = (int)range.Min;
  52. cmpTarget.OnValueChange += CmpTarget_OnValueChange;
  53. cmpTarget.Tag = range;
  54. cmpTarget.Value = m_camera.Target;
  55. //增益
  56. range = m_camera.GetGlobalGainRange();
  57. cmpGain.Max = (int)range.Max;
  58. cmpGain.Min = (int)range.Min;
  59. cmpGain.IsRangeVisible = false;
  60. cmpGain.OnValueChange += CmpGain_OnValueChange;
  61. cmpGain.Value = m_camera.Gain;
  62. if (ckbAutoExposure.Checked)
  63. {
  64. SetAutoExposure();
  65. }
  66. else
  67. {
  68. SetFixedExposure();
  69. }
  70. }
  71. }
  72. public void UpdateSettings()
  73. {
  74. ckbAutoExposure.Checked = _settings.ATExposure == 1;
  75. cmpTarget.Value = m_camera.Target;
  76. var value = m_camera.ExposureTime;
  77. cmpGain.Value = m_camera.Gain;
  78. UpdateTimeDisplay(value);
  79. UpdateTimeBar(value);
  80. }
  81. private void CmpGain_OnValueChange(int value)
  82. {
  83. m_camera.Gain = value;
  84. _settings.GlobalGain = value;
  85. }
  86. private void CmpTarget_OnValueChange(int value)
  87. {
  88. _settings.GlobalGain = value;
  89. m_camera.Target = value;
  90. }
  91. #region Exposure
  92. private void InitializeExposure()
  93. {
  94. Range range = m_camera.GetExposureTimeRange();
  95. tkbExposure.Tag = range;
  96. tkbExposure.Minimum = (int)Math.Log(range.Min * 1000, 1.1);
  97. tkbExposure.Maximum = (int)Math.Log(range.Max * 1000, 1.1);//毫秒转微秒
  98. var value = m_camera.ExposureTime;
  99. UpdateTimeDisplay(value);
  100. UpdateTimeBar(value);
  101. }
  102. private void tkbExposure_Scroll(object sender, EventArgs e)
  103. {
  104. double value = tkbExposure.Value;
  105. Range rang1 = tkbExposure.Tag as Range;
  106. if (value == tkbExposure.Minimum) value = rang1.Min;
  107. else if (value == tkbExposure.Maximum) value = rang1.Max;
  108. else value = Math.Pow(1.1, value) / 1000;//微秒转毫秒
  109. Exposure_OnValueChange(value);
  110. UpdateTimeDisplay(value);
  111. }
  112. private void UpdateTimeDisplay(double value)
  113. {
  114. txbUs.Text = (int)(value * 1000) % 1000 + "";
  115. txbMs.Text = (int)(value % 1000) + "";
  116. txbS.Text = (int)(value / 1000) % 1000 + "";
  117. }
  118. private void UpdateTimeBar(double value)
  119. {
  120. if (value == 0)
  121. return;
  122. int value1 = (int)Math.Log(value * 1000, 1.1);
  123. tkbExposure.Value = Math.Min(Math.Max(value1, tkbExposure.Minimum), tkbExposure.Maximum);
  124. }
  125. private void Exposure_OnValueChange(double obj)
  126. {
  127. _settings.LNExposure = obj;
  128. m_camera.ExposureTime = obj;
  129. }
  130. private void Exposure_KeyPress(object sender, KeyPressEventArgs e)
  131. {
  132. if (!char.IsDigit(e.KeyChar) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Back)) // 非数字键, 放弃该输入
  133. {
  134. e.Handled = true;
  135. return;
  136. }
  137. if (e.KeyChar == (char)Keys.Enter)
  138. {
  139. try
  140. {
  141. double value = Convert.ToInt32(txbUs.Text);
  142. value += Convert.ToInt32(txbMs.Text) * 1000;
  143. value += Convert.ToInt32(txbS.Text) * 1000 * 1000;
  144. value /= 1000;
  145. var range = tkbExposure.Tag as Range;
  146. value = Math.Min(range.Max, Math.Max(range.Min, value));
  147. UpdateTimeDisplay(value);
  148. UpdateTimeBar(value);
  149. Exposure_OnValueChange(value);
  150. }
  151. catch (Exception ex)
  152. {
  153. MessageBox.Show(ex.Message);
  154. }
  155. }
  156. }
  157. #endregion
  158. #region Auto/Fixed Exposure
  159. public void OnTimerAutoExposure()
  160. {
  161. _exposureValue = m_camera.ExposureTime;
  162. cmpGain.Value = m_camera.Gain;
  163. UpdateTimeDisplay(_exposureValue);
  164. UpdateTimeBar(_exposureValue);
  165. }
  166. private void ckbAutoExposure_Click(object sender, EventArgs e)
  167. {
  168. var isAuto = ckbAutoExposure.Checked;
  169. if (isAuto)
  170. {
  171. SetAutoExposure();
  172. }
  173. else
  174. {
  175. SetFixedExposure();
  176. }
  177. }
  178. private void btnAutoExposureOnce_Click(object sender, EventArgs e)
  179. {
  180. SetAutoExposure();
  181. ckbAutoExposure.Checked = false;
  182. new Thread(() =>
  183. {
  184. Thread.Sleep(1000);
  185. SetFixedExposure();
  186. this.Invoke(new Action(OnTimerAutoExposure));
  187. }).Start();
  188. }
  189. void SetAutoExposure()
  190. {
  191. _settings.ATExposure = 1;
  192. m_camera.AutoExposure = 1;
  193. //自动曝光恢复默认Gain(增益)
  194. var defGain = 0;
  195. m_camera.Gain = defGain;
  196. }
  197. void SetFixedExposure()
  198. {
  199. _settings.ATExposure = 0;
  200. m_camera.AutoExposure = 0;
  201. _settings.LNExposure = m_camera.ExposureTime;
  202. }
  203. #endregion
  204. /// <summary>
  205. /// 刷新控件状态
  206. /// </summary>
  207. public void UpdateDisplay()
  208. {
  209. var isAuto = _settings.ATExposure == 1;
  210. ckbAutoExposure.Checked = isAuto;
  211. pnlExposure.Enabled = !isAuto;
  212. cmpGain.Enabled = !isAuto;
  213. if (isAuto)//固定曝光
  214. {
  215. OnTimerAutoExposure();
  216. }
  217. }
  218. }
  219. }