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

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<DialogResponse> GetDeviceVideoList()
{
Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
{
DialogResponse response = new DialogResponse()
{
code = -1
};
var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices.Count == 0)
{
response.message = "无视频输入设备";
return response;
}
string name = "";
List<DeviceItem> list = new List<DeviceItem>();
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<DialogResponse> GetPixelVideoList(int deviceIndex)
{
Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
{
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<VideoPixelItem> list = new List<VideoPixelItem>();
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<DialogResponse> GetImage(RequestInterface req)
{
Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
{
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<VideoPixelItem> list = new List<VideoPixelItem>();
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<ImageResponse> images = new List<ImageResponse>();
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<DialogResponse> GetImage2(RequestInterface req)
{
Task<DialogResponse> task = Task.Factory.StartNew<DialogResponse>(() =>
{
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<VideoPixelItem> list = new List<VideoPixelItem>();
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<ImageResponse> images = new List<ImageResponse>();
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;
}
}
}