TUCameraImageSave.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using TUCAMAPI;
  8. namespace TUCamera
  9. {
  10. class TUCameraImageSave : TUCameraIFrameProcess
  11. {
  12. private bool m_isDeal = true;
  13. private event DoneHandler m_handler;
  14. private string m_eventId;
  15. private int m_timeLapse;
  16. private int m_count;
  17. private TimeSpan m_startTime;
  18. private int intervalTime = 0;
  19. private int m_duration = 0;
  20. private string m_savePath;
  21. private string m_imagePrefix;
  22. private List<string> m_imgList = new List<string>();
  23. private TUIMG_FORMATS m_imgFormat;
  24. private IntPtr m_hIdxTUCam;
  25. /// <summary>
  26. /// 拍摄固定张数图片
  27. /// </summary>
  28. /// <param name="savePath">文件保存路径</param>
  29. /// <param name="imagePrefix">文件名前缀</param>
  30. /// <param name="imageFormat">文件保存格式</param>
  31. /// <param name="timeLapse">时间间隔</param>
  32. /// <param name="count">拍摄次数</param>
  33. /// <param name="handler">完成委托</param>
  34. /// <param name="imgList">拍摄完成的图片List</param>
  35. public TUCameraImageSave(ref string eventId, ref DoneHandler handler, string savePath, string imagePrefix, TUIMG_FORMATS imageFormat, int timeLapse, int count, IntPtr hIdxTUCam)
  36. {
  37. eventId = System.Guid.NewGuid().ToString("N");
  38. m_savePath = savePath;
  39. m_imagePrefix = imagePrefix;
  40. m_imgFormat = imageFormat;
  41. m_timeLapse = timeLapse;
  42. m_count = count;
  43. m_handler = handler;
  44. m_hIdxTUCam = hIdxTUCam;
  45. m_eventId = eventId;
  46. }
  47. /// <summary>
  48. /// 最大速度持续一段时间拍摄
  49. /// </summary>
  50. /// <param name="savePath">文件保存路径</param>
  51. /// <param name="imagePrefix">文件名前缀</param>
  52. /// <param name="imageFormat">文件保存格式</param>
  53. /// <param name="duration">持续拍摄时间</param>
  54. /// <param name="handler">完成委托</param>
  55. /// <param name="imgList">拍摄完成的图片List</param>
  56. public TUCameraImageSave(ref string eventId, ref DoneHandler handler, string savePath, string imagePrefix, TUIMG_FORMATS imageFormat, int duration, IntPtr hIdxTUCam)
  57. {
  58. eventId = System.Guid.NewGuid().ToString("N");
  59. m_savePath = savePath;
  60. m_imagePrefix = imagePrefix;
  61. m_imgFormat = imageFormat;
  62. m_duration = duration;
  63. m_handler = handler;
  64. m_hIdxTUCam = hIdxTUCam;
  65. m_eventId = eventId;
  66. }
  67. public void doProcess(ref TUCAM_FRAME frame, bool pause)
  68. {
  69. if (!m_isDeal || pause)
  70. {
  71. return;
  72. }
  73. if (m_startTime == new TimeSpan(0))
  74. {
  75. m_startTime = new TimeSpan(DateTime.Now.Ticks);
  76. }
  77. // 拍摄固定张数图片
  78. if (m_duration == 0)
  79. {
  80. TimeSpan stopTime = new TimeSpan(DateTime.Now.Ticks);
  81. intervalTime = (int)m_startTime.Subtract(stopTime).Duration().TotalMilliseconds;
  82. if (intervalTime > m_timeLapse)
  83. {
  84. m_startTime = stopTime;
  85. saveImage(ref m_hIdxTUCam, ref frame);
  86. if (m_count <= 0)
  87. {
  88. stop();
  89. }
  90. }
  91. }
  92. else
  93. {
  94. // 持续一直拍摄
  95. if (m_duration < 0)
  96. {
  97. saveImage(ref m_hIdxTUCam, ref frame);
  98. return;
  99. }
  100. // 持续一段时间拍摄
  101. TimeSpan stopTime = new TimeSpan(DateTime.Now.Ticks);
  102. intervalTime = (int)m_startTime.Subtract(stopTime).Duration().TotalMilliseconds;
  103. if (intervalTime <= m_duration)
  104. {
  105. saveImage(ref m_hIdxTUCam, ref frame);
  106. }
  107. else
  108. {
  109. stop();
  110. }
  111. }
  112. }
  113. public bool isDeal()
  114. {
  115. return m_isDeal;
  116. }
  117. private void saveImage(ref IntPtr hIdxTUCam, ref TUCAM_FRAME frame)
  118. {
  119. DateTime now = DateTime.Now;
  120. string fileName = m_savePath + "\\" + m_imagePrefix + now.Year.ToString() + now.Month.ToString("D2") + now.Day.ToString("D2") + now.Hour.ToString("D2") + now.Minute.ToString("D2") + now.Second.ToString("D2") + now.Millisecond.ToString("D3");
  121. // 保存JPG格式 // Save other format data(TIFF/BMP/PNG/JPEG)
  122. int fileFormat = (int)(m_imgFormat);
  123. TUCAM_FILE_SAVE fileSave;
  124. fileSave.pstrSavePath = Marshal.StringToHGlobalAnsi(fileName);
  125. // struct to IntPtr
  126. fileSave.pFrame = Marshal.AllocHGlobal(Marshal.SizeOf(frame));
  127. Marshal.StructureToPtr(frame, fileSave.pFrame, true);
  128. fileSave.nSaveFmt = fileFormat;
  129. if (TUCAMRET.TUCAMRET_SUCCESS == TUCamAPI.TUCAM_File_SaveImage(hIdxTUCam, fileSave))
  130. {
  131. m_imgList.Add(creatImageName(fileName, m_imgFormat));
  132. if (m_count > 0)
  133. {
  134. m_count--;
  135. }
  136. }
  137. }
  138. private string creatImageName(string fileName, TUIMG_FORMATS imageFormat)
  139. {
  140. // string fileName = fileName;
  141. switch (imageFormat)
  142. {
  143. case TUIMG_FORMATS.TUFMT_PNG:
  144. fileName = fileName + ".png";
  145. break;
  146. case TUIMG_FORMATS.TUFMT_BMP:
  147. fileName = fileName + ".bmp";
  148. break;
  149. case TUIMG_FORMATS.TUFMT_TIF:
  150. fileName = fileName + ".tif";
  151. break;
  152. default:
  153. fileName = fileName + ".jpg";
  154. break;
  155. }
  156. return fileName;
  157. }
  158. public string getEventId()
  159. {
  160. return m_eventId;
  161. }
  162. public void stop()
  163. {
  164. m_isDeal = false;
  165. m_handler(m_eventId, true, 0, "结束", m_imgList);
  166. }
  167. }
  168. }