You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

421 lines
19 KiB

1 month ago
  1. using AForge.Video.DirectShow;
  2. using OpenCvSharp;
  3. using ShenTun.ImageCollection.Common;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Drawing.Imaging;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. using System.Windows.Forms;
  15. namespace ShenTun.ImageCollection.AForgeCamera
  16. {
  17. public class CameraGrah
  18. {
  19. private AForge.Controls.VideoSourcePlayer videoSourcePlayer1;
  20. private FilterInfoCollection videoDevices;
  21. private VideoCaptureDevice videoSource;
  22. public async Task<DialogResponse> GetDeviceVideoList()
  23. {
  24. Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
  25. {
  26. DialogResponse response = new DialogResponse()
  27. {
  28. code = -1
  29. };
  30. var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
  31. if (videoDevices.Count == 0)
  32. {
  33. response.message = "无视频输入设备";
  34. return response;
  35. }
  36. string name = "";
  37. List<DeviceItem> list = new List<DeviceItem>();
  38. for (int i = 0; i < videoDevices.Count; i++)
  39. {
  40. name = videoDevices[0].Name;
  41. DeviceItem d = new DeviceItem()
  42. {
  43. index = i,
  44. text = name,
  45. };
  46. list.Add(d);
  47. }
  48. response.code = 1;
  49. response.data = list;
  50. return response;
  51. });
  52. var res = await task;
  53. return res;
  54. }
  55. public async Task<DialogResponse> GetPixelVideoList(int deviceIndex)
  56. {
  57. Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
  58. {
  59. DialogResponse response = new DialogResponse()
  60. {
  61. code = -1
  62. };
  63. var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
  64. if (videoDevices.Count == 0)
  65. {
  66. response.message = "无视频输入设备";
  67. return response;
  68. }
  69. var _cameraDevice = new VideoCaptureDevice(videoDevices[deviceIndex].MonikerString);
  70. if (_cameraDevice.VideoCapabilities.Length == 0)
  71. {
  72. response.message = "视频设备无分辨率";
  73. return response;
  74. }
  75. string text = "";
  76. List<VideoPixelItem> list = new List<VideoPixelItem>();
  77. for (int i = 0; i < _cameraDevice.VideoCapabilities.Length; i++)
  78. {
  79. text = string.Format("{0} x {1}", _cameraDevice.VideoCapabilities[i].FrameSize.Width, _cameraDevice.VideoCapabilities[i].FrameSize.Height);
  80. VideoPixelItem item = new VideoPixelItem()
  81. {
  82. index = i,
  83. text = text,
  84. width = _cameraDevice.VideoCapabilities[i].FrameSize.Width
  85. };
  86. list.Add(item);
  87. }
  88. var listSort = list.OrderByDescending(p => p.width).ToList();
  89. response.code = 1;
  90. response.data = listSort;
  91. return response;
  92. });
  93. var res = await task;
  94. return res;
  95. }
  96. public async Task<DialogResponse> GetImage(RequestInterface req)
  97. {
  98. Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
  99. {
  100. DialogResponse response = new DialogResponse()
  101. {
  102. code = -1
  103. };
  104. try
  105. {
  106. if (string.IsNullOrEmpty(req.ImagePath))
  107. {
  108. response.message = "本地图片目录未设置";
  109. return response;
  110. }
  111. if (string.IsNullOrEmpty(req.BarCode))
  112. {
  113. response.message = "条形码不能为空";
  114. return response;
  115. }
  116. if (req.VideoDevice == -1)
  117. {
  118. response.message = "请在客户端参数中设置视频设备";
  119. return response;
  120. }
  121. if (req.VideoPixel==-1)
  122. {
  123. response.message = "请在客户端参数中设置视频分辨率";
  124. return response;
  125. }
  126. string file_path = ImageHelper.GetLoaclPath(req.ImagePath,req.AsbitemName);
  127. string fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode,"0001", "jpg");
  128. if (File.Exists(fileName))
  129. {
  130. for(int i = 1; i < req.Total; i++)
  131. {
  132. int index = fileName.IndexOf("_");
  133. string idStr = fileName.Substring(index + 1, 4);
  134. int id = Convert.ToInt32(idStr);
  135. id++;
  136. string temp=Convert.ToString(id).PadLeft(4, '0');
  137. fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode, temp, "jpg");
  138. if (!File.Exists(fileName)) break;
  139. }
  140. if(File.Exists(fileName)) File.Delete(fileName);
  141. }
  142. videoSourcePlayer1 = new AForge.Controls.VideoSourcePlayer();
  143. videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
  144. if (videoDevices.Count == 0)
  145. throw new ApplicationException();
  146. videoSource = new VideoCaptureDevice(videoDevices[req.VideoDevice].MonikerString);
  147. try
  148. {
  149. //Check if the video device provides a list of supported resolutions
  150. if (videoSource.VideoCapabilities.Length > 0)
  151. {
  152. string text = string.Empty;
  153. List<VideoPixelItem> list = new List<VideoPixelItem>();
  154. for (int i = 0; i < videoSource.VideoCapabilities.Length; i++)
  155. {
  156. text = string.Format("{0} x {1}", videoSource.VideoCapabilities[i].FrameSize.Width, videoSource.VideoCapabilities[i].FrameSize.Height);
  157. VideoPixelItem item = new VideoPixelItem()
  158. {
  159. index = i,
  160. text = text,
  161. width = videoSource.VideoCapabilities[i].FrameSize.Width
  162. };
  163. list.Add(item);
  164. }
  165. var listSort = list.OrderByDescending(p => p.width).ToList();
  166. var videoItem = listSort.Where(p => p.index == req.VideoPixel).FirstOrDefault();
  167. //Set the highest resolution as active
  168. videoSource.VideoResolution = videoSource.VideoCapabilities[videoItem.index];
  169. }
  170. }
  171. catch { }
  172. videoSourcePlayer1.VideoSource = videoSource;
  173. videoSourcePlayer1.Start();
  174. int delay = Convert.ToInt32(1000 * req.Delay);
  175. Thread.Sleep(delay);
  176. Bitmap imgMap = videoSourcePlayer1.GetCurrentVideoFrame();
  177. videoSourcePlayer1.SignalToStop();
  178. videoSourcePlayer1.WaitForStop();
  179. ImageCodecInfo Encoder = ImageHelper.GetEncoder(ImageFormat.Jpeg);
  180. System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
  181. EncoderParameters myEncoderParameters = new EncoderParameters(1);
  182. EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, req.Quality);
  183. myEncoderParameters.Param[0] = myEncoderParameter;
  184. if (imgMap == null)
  185. {
  186. response.message = "捕获图片失败,请延长采图延迟时间";
  187. return response;
  188. }
  189. imgMap.Save(fileName, Encoder, myEncoderParameters);
  190. imgMap.Dispose();
  191. ImageRectHelper.AutoCutImage(fileName,req.TopLeftX,req.TopLeftY,req.BottomRightX,req.BottomRightY);
  192. if (req.mode == 2)
  193. {
  194. Bitmap bitmap=new Bitmap(fileName);
  195. using (MemoryStream mstr = new MemoryStream())
  196. {
  197. bitmap.Save(mstr, Encoder, myEncoderParameters);
  198. bitmap.Dispose();
  199. FrmImage frm = new FrmImage(mstr,fileName);
  200. frm.ShowDialog();
  201. if (frm.DialogResult == DialogResult.OK)
  202. {
  203. Bitmap bitmap1 = ImageData.Image;
  204. Bitmap oldImg = null;
  205. oldImg = (Bitmap)bitmap.Clone();
  206. bitmap1.Dispose();
  207. Bitmap img = new Bitmap(oldImg);
  208. Graphics draw = Graphics.FromImage(img);
  209. draw.DrawImage(oldImg, 0, 0, oldImg.Width, oldImg.Height);
  210. oldImg.Dispose();
  211. //frm.Close();
  212. //frm.Dispose();
  213. //File.Delete(fileName);
  214. img.Save(fileName, Encoder, myEncoderParameters);
  215. img.Dispose();
  216. }
  217. }
  218. }
  219. using (System.Drawing.Image imge = System.Drawing.Image.FromFile(fileName))
  220. {
  221. ImageResponse resPhoto = new ImageResponse()
  222. {
  223. Image = ImageHelper.ConvertImageToBase64(imge),
  224. FilePath = fileName,
  225. ImageFormat = "jpg"
  226. };
  227. List<ImageResponse> images = new List<ImageResponse>();
  228. images.Add(resPhoto);
  229. response.code = 1;
  230. response.message = "Success";
  231. response.data = images;
  232. }
  233. return response;
  234. }
  235. catch (Exception ex)
  236. {
  237. response.code = -100;
  238. response.message = "采集异常:" + ex.Message;
  239. return response;
  240. }
  241. });
  242. DialogResponse res = await task;
  243. return res;
  244. }
  245. public async Task<DialogResponse> GetImage2(RequestInterface req)
  246. {
  247. Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
  248. {
  249. DialogResponse response = new DialogResponse()
  250. {
  251. code = -1
  252. };
  253. try
  254. {
  255. if (string.IsNullOrEmpty(req.ImagePath))
  256. {
  257. response.message = "本地图片目录未设置";
  258. return response;
  259. }
  260. if (string.IsNullOrEmpty(req.BarCode))
  261. {
  262. response.message = "条形码不能为空";
  263. return response;
  264. }
  265. if (req.VideoDevice == -1)
  266. {
  267. response.message = "请在客户端参数中设置视频设备";
  268. return response;
  269. }
  270. if (req.VideoPixel == -1)
  271. {
  272. response.message = "请在客户端参数中设置视频分辨率";
  273. return response;
  274. }
  275. string file_path = ImageHelper.GetLoaclPath(req.ImagePath, req.AsbitemName);
  276. string fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode, "0001", "jpg");
  277. if (File.Exists(fileName))
  278. {
  279. for (int i = 1; i < req.Total; i++)
  280. {
  281. int index = fileName.IndexOf("_");
  282. string idStr = fileName.Substring(index + 1, 4);
  283. int id = Convert.ToInt32(idStr);
  284. id++;
  285. string temp = Convert.ToString(id).PadLeft(4, '0');
  286. fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode, temp, "jpg");
  287. if (!File.Exists(fileName)) break;
  288. }
  289. if (File.Exists(fileName)) File.Delete(fileName);
  290. }
  291. videoSourcePlayer1 = new AForge.Controls.VideoSourcePlayer();
  292. videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
  293. if (videoDevices.Count == 0)
  294. throw new ApplicationException();
  295. videoSource = new VideoCaptureDevice(videoDevices[req.VideoDevice].MonikerString);
  296. try
  297. {
  298. //Check if the video device provides a list of supported resolutions
  299. if (videoSource.VideoCapabilities.Length > 0)
  300. {
  301. string text = string.Empty;
  302. List<VideoPixelItem> list = new List<VideoPixelItem>();
  303. for (int i = 0; i < videoSource.VideoCapabilities.Length; i++)
  304. {
  305. text = string.Format("{0} x {1}", videoSource.VideoCapabilities[i].FrameSize.Width, videoSource.VideoCapabilities[i].FrameSize.Height);
  306. VideoPixelItem item = new VideoPixelItem()
  307. {
  308. index = i,
  309. text = text,
  310. width = videoSource.VideoCapabilities[i].FrameSize.Width
  311. };
  312. list.Add(item);
  313. }
  314. var listSort = list.OrderByDescending(p => p.width).ToList();
  315. var videoItem = listSort.Where(p => p.index == req.VideoPixel).FirstOrDefault();
  316. //Set the highest resolution as active
  317. videoSource.VideoResolution = videoSource.VideoCapabilities[videoItem.index];
  318. }
  319. }
  320. catch { }
  321. videoSourcePlayer1.VideoSource = videoSource;
  322. videoSourcePlayer1.Start();
  323. int delay = Convert.ToInt32(1000 * req.Delay);
  324. Thread.Sleep(delay);
  325. Bitmap imgMap = videoSourcePlayer1.GetCurrentVideoFrame();
  326. videoSourcePlayer1.SignalToStop();
  327. videoSourcePlayer1.WaitForStop();
  328. ImageCodecInfo Encoder = ImageHelper.GetEncoder(ImageFormat.Jpeg);
  329. System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
  330. EncoderParameters myEncoderParameters = new EncoderParameters(1);
  331. EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, req.Quality);
  332. myEncoderParameters.Param[0] = myEncoderParameter;
  333. if (imgMap == null)
  334. {
  335. response.message = "捕获图片失败,请延长采图延迟时间";
  336. return response;
  337. }
  338. if (req.mode == 2)
  339. {
  340. Bitmap bitmap;
  341. using (MemoryStream mstr = new MemoryStream())
  342. {
  343. imgMap.Save(mstr, Encoder, myEncoderParameters);
  344. FrmImageEdit frm = new FrmImageEdit(mstr,fileName);
  345. frm.ShowDialog();
  346. if (frm.DialogResult != DialogResult.OK)
  347. {
  348. bitmap = (Bitmap)ImageHelper.GetImage(mstr);
  349. }
  350. else
  351. {
  352. bitmap = ImageData.Image;
  353. }
  354. //frm.Close();
  355. //frm.Dispose();
  356. bitmap.Save(fileName, Encoder, myEncoderParameters);
  357. }
  358. bitmap.Dispose();
  359. }
  360. else
  361. {
  362. imgMap.Save(fileName, Encoder, myEncoderParameters);
  363. imgMap.Dispose();
  364. }
  365. using (System.Drawing.Image imge = System.Drawing.Image.FromFile(fileName))
  366. {
  367. ImageResponse resPhoto = new ImageResponse()
  368. {
  369. Image = ImageHelper.ConvertImageToBase64(imge),
  370. FilePath = fileName,
  371. ImageFormat = "jpg"
  372. };
  373. List<ImageResponse> images = new List<ImageResponse>();
  374. images.Add(resPhoto);
  375. response.code = 1;
  376. response.message = "Success";
  377. response.data = images;
  378. }
  379. return response;
  380. }
  381. catch (Exception ex)
  382. {
  383. response.code = -100;
  384. response.message = "采集异常:" + ex.Message;
  385. return response;
  386. }
  387. });
  388. DialogResponse res = await task;
  389. return res;
  390. }
  391. }
  392. }