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
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;
|
|
}
|
|
}
|
|
}
|