using AForge.Video.DirectShow; using OpenCvSharp; using ShenTun.ImageCollection.Common; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace ShenTun.ImageCollection.AForgeCamera { public class CameraGrah { private AForge.Controls.VideoSourcePlayer videoSourcePlayer1; private FilterInfoCollection videoDevices; private VideoCaptureDevice videoSource; public async Task GetDeviceVideoList() { Task task = Task.Factory.StartNew(() => { DialogResponse response = new DialogResponse() { code = -1 }; var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == 0) { response.message = "无视频输入设备"; return response; } string name = ""; List list = new List(); for (int i = 0; i < videoDevices.Count; i++) { name = videoDevices[0].Name; DeviceItem d = new DeviceItem() { index = i, text = name, }; list.Add(d); } response.code = 1; response.data = list; return response; }); var res = await task; return res; } public async Task GetPixelVideoList(int deviceIndex) { Task task = Task.Factory.StartNew(() => { DialogResponse response = new DialogResponse() { code = -1 }; var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == 0) { response.message = "无视频输入设备"; return response; } var _cameraDevice = new VideoCaptureDevice(videoDevices[deviceIndex].MonikerString); if (_cameraDevice.VideoCapabilities.Length == 0) { response.message = "视频设备无分辨率"; return response; } string text = ""; List list = new List(); for (int i = 0; i < _cameraDevice.VideoCapabilities.Length; i++) { text = string.Format("{0} x {1}", _cameraDevice.VideoCapabilities[i].FrameSize.Width, _cameraDevice.VideoCapabilities[i].FrameSize.Height); VideoPixelItem item = new VideoPixelItem() { index = i, text = text, width = _cameraDevice.VideoCapabilities[i].FrameSize.Width }; list.Add(item); } var listSort = list.OrderByDescending(p => p.width).ToList(); response.code = 1; response.data = listSort; return response; }); var res = await task; return res; } public async Task GetImage(RequestInterface req) { Task task = Task.Factory.StartNew(() => { DialogResponse response = new DialogResponse() { code = -1 }; try { if (string.IsNullOrEmpty(req.ImagePath)) { response.message = "本地图片目录未设置"; return response; } if (string.IsNullOrEmpty(req.BarCode)) { response.message = "条形码不能为空"; return response; } if (req.VideoDevice == -1) { response.message = "请在客户端参数中设置视频设备"; return response; } if (req.VideoPixel==-1) { response.message = "请在客户端参数中设置视频分辨率"; return response; } string file_path = ImageHelper.GetLoaclPath(req.ImagePath,req.AsbitemName); string fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode,"0001", "jpg"); if (File.Exists(fileName)) { for(int i = 1; i < req.Total; i++) { int index = fileName.IndexOf("_"); string idStr = fileName.Substring(index + 1, 4); int id = Convert.ToInt32(idStr); id++; string temp=Convert.ToString(id).PadLeft(4, '0'); fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode, temp, "jpg"); if (!File.Exists(fileName)) break; } if(File.Exists(fileName)) File.Delete(fileName); } videoSourcePlayer1 = new AForge.Controls.VideoSourcePlayer(); videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == 0) throw new ApplicationException(); videoSource = new VideoCaptureDevice(videoDevices[req.VideoDevice].MonikerString); try { //Check if the video device provides a list of supported resolutions if (videoSource.VideoCapabilities.Length > 0) { string text = string.Empty; List list = new List(); for (int i = 0; i < videoSource.VideoCapabilities.Length; i++) { text = string.Format("{0} x {1}", videoSource.VideoCapabilities[i].FrameSize.Width, videoSource.VideoCapabilities[i].FrameSize.Height); VideoPixelItem item = new VideoPixelItem() { index = i, text = text, width = videoSource.VideoCapabilities[i].FrameSize.Width }; list.Add(item); } var listSort = list.OrderByDescending(p => p.width).ToList(); var videoItem = listSort.Where(p => p.index == req.VideoPixel).FirstOrDefault(); //Set the highest resolution as active videoSource.VideoResolution = videoSource.VideoCapabilities[videoItem.index]; } } catch { } videoSourcePlayer1.VideoSource = videoSource; videoSourcePlayer1.Start(); int delay = Convert.ToInt32(1000 * req.Delay); Thread.Sleep(delay); Bitmap imgMap = videoSourcePlayer1.GetCurrentVideoFrame(); videoSourcePlayer1.SignalToStop(); videoSourcePlayer1.WaitForStop(); ImageCodecInfo Encoder = ImageHelper.GetEncoder(ImageFormat.Jpeg); System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, req.Quality); myEncoderParameters.Param[0] = myEncoderParameter; if (imgMap == null) { response.message = "捕获图片失败,请延长采图延迟时间"; return response; } imgMap.Save(fileName, Encoder, myEncoderParameters); imgMap.Dispose(); ImageRectHelper.AutoCutImage(fileName,req.TopLeftX,req.TopLeftY,req.BottomRightX,req.BottomRightY); if (req.mode == 2) { Bitmap bitmap=new Bitmap(fileName); using (MemoryStream mstr = new MemoryStream()) { bitmap.Save(mstr, Encoder, myEncoderParameters); bitmap.Dispose(); FrmImage frm = new FrmImage(mstr,fileName); frm.ShowDialog(); if (frm.DialogResult == DialogResult.OK) { Bitmap bitmap1 = ImageData.Image; Bitmap oldImg = null; oldImg = (Bitmap)bitmap.Clone(); bitmap1.Dispose(); Bitmap img = new Bitmap(oldImg); Graphics draw = Graphics.FromImage(img); draw.DrawImage(oldImg, 0, 0, oldImg.Width, oldImg.Height); oldImg.Dispose(); //frm.Close(); //frm.Dispose(); //File.Delete(fileName); img.Save(fileName, Encoder, myEncoderParameters); img.Dispose(); } } } using (System.Drawing.Image imge = System.Drawing.Image.FromFile(fileName)) { ImageResponse resPhoto = new ImageResponse() { Image = ImageHelper.ConvertImageToBase64(imge), FilePath = fileName, ImageFormat = "jpg" }; List images = new List(); images.Add(resPhoto); response.code = 1; response.message = "Success"; response.data = images; } return response; } catch (Exception ex) { response.code = -100; response.message = "采集异常:" + ex.Message; return response; } }); DialogResponse res = await task; return res; } public async Task GetImage2(RequestInterface req) { Task task = Task.Factory.StartNew(() => { DialogResponse response = new DialogResponse() { code = -1 }; try { if (string.IsNullOrEmpty(req.ImagePath)) { response.message = "本地图片目录未设置"; return response; } if (string.IsNullOrEmpty(req.BarCode)) { response.message = "条形码不能为空"; return response; } if (req.VideoDevice == -1) { response.message = "请在客户端参数中设置视频设备"; return response; } if (req.VideoPixel == -1) { response.message = "请在客户端参数中设置视频分辨率"; return response; } string file_path = ImageHelper.GetLoaclPath(req.ImagePath, req.AsbitemName); string fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode, "0001", "jpg"); if (File.Exists(fileName)) { for (int i = 1; i < req.Total; i++) { int index = fileName.IndexOf("_"); string idStr = fileName.Substring(index + 1, 4); int id = Convert.ToInt32(idStr); id++; string temp = Convert.ToString(id).PadLeft(4, '0'); fileName = string.Format("{0}\\{1}_{2}.{3}", file_path, req.BarCode, temp, "jpg"); if (!File.Exists(fileName)) break; } if (File.Exists(fileName)) File.Delete(fileName); } videoSourcePlayer1 = new AForge.Controls.VideoSourcePlayer(); videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == 0) throw new ApplicationException(); videoSource = new VideoCaptureDevice(videoDevices[req.VideoDevice].MonikerString); try { //Check if the video device provides a list of supported resolutions if (videoSource.VideoCapabilities.Length > 0) { string text = string.Empty; List list = new List(); for (int i = 0; i < videoSource.VideoCapabilities.Length; i++) { text = string.Format("{0} x {1}", videoSource.VideoCapabilities[i].FrameSize.Width, videoSource.VideoCapabilities[i].FrameSize.Height); VideoPixelItem item = new VideoPixelItem() { index = i, text = text, width = videoSource.VideoCapabilities[i].FrameSize.Width }; list.Add(item); } var listSort = list.OrderByDescending(p => p.width).ToList(); var videoItem = listSort.Where(p => p.index == req.VideoPixel).FirstOrDefault(); //Set the highest resolution as active videoSource.VideoResolution = videoSource.VideoCapabilities[videoItem.index]; } } catch { } videoSourcePlayer1.VideoSource = videoSource; videoSourcePlayer1.Start(); int delay = Convert.ToInt32(1000 * req.Delay); Thread.Sleep(delay); Bitmap imgMap = videoSourcePlayer1.GetCurrentVideoFrame(); videoSourcePlayer1.SignalToStop(); videoSourcePlayer1.WaitForStop(); ImageCodecInfo Encoder = ImageHelper.GetEncoder(ImageFormat.Jpeg); System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, req.Quality); myEncoderParameters.Param[0] = myEncoderParameter; if (imgMap == null) { response.message = "捕获图片失败,请延长采图延迟时间"; return response; } if (req.mode == 2) { Bitmap bitmap; using (MemoryStream mstr = new MemoryStream()) { imgMap.Save(mstr, Encoder, myEncoderParameters); FrmImageEdit frm = new FrmImageEdit(mstr,fileName); frm.ShowDialog(); if (frm.DialogResult != DialogResult.OK) { bitmap = (Bitmap)ImageHelper.GetImage(mstr); } else { bitmap = ImageData.Image; } //frm.Close(); //frm.Dispose(); bitmap.Save(fileName, Encoder, myEncoderParameters); } bitmap.Dispose(); } else { imgMap.Save(fileName, Encoder, myEncoderParameters); imgMap.Dispose(); } using (System.Drawing.Image imge = System.Drawing.Image.FromFile(fileName)) { ImageResponse resPhoto = new ImageResponse() { Image = ImageHelper.ConvertImageToBase64(imge), FilePath = fileName, ImageFormat = "jpg" }; List images = new List(); images.Add(resPhoto); response.code = 1; response.message = "Success"; response.data = images; } return response; } catch (Exception ex) { response.code = -100; response.message = "采集异常:" + ex.Message; return response; } }); DialogResponse res = await task; return res; } } }