using OpenCvSharp;
using OpenCvSharp.Extensions;
using OTSCommon.Model;
using OTSIncAReportGraph;
using OTSIncAReportGraph.Class;
using OTSIncAReportGraph.OTSIncAReportGraphFuncation;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OTSIncAReportApp._1_UI.Control_Graph.Controls
{
class ImageSplicer
{
public double picYmin { get; set; }
public double picXmin { get; set; }
public int imgeH { get; set; }
public int imgeW { get; set; }
///
/// 单纯图像拼接无颗粒颜色渲染
///
///
///
///
public List Mosaics(ResultFile resultFile,List m_list_allDfield)
{
List list_dt_picdata = new List();
DataTable picDatat = new DataTable();
List fieldlist = resultFile.List_OTSField;
picDatat.Columns.Add("X", typeof(double));
picDatat.Columns.Add("Y", typeof(double));
foreach (var f in m_list_allDfield)
{
DataRow dr = picDatat.NewRow();
dr["X"] = f.OTSCoordinatePos.X;
dr["Y"] = f.OTSCoordinatePos.Y;
picDatat.Rows.Add(dr);
}
DataTable total_dt_X = picDatat.Copy();
DataView dv_x = total_dt_X.DefaultView;
DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
dv_x_2.Sort = "X ASC";
total_dt_X = dv_x_2.ToTable();
DataTable total_dt_Y = picDatat.Copy();
DataView dv_Y = total_dt_Y.DefaultView;
DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
dv_Y_2.Sort = "Y ASC";
total_dt_Y = dv_Y_2.ToTable();
//循环每一行图片
for (int i = 0; i < total_dt_Y.Rows.Count; i++)
{
NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
DataTable data = new DataTable();
data.Columns.Add("mat", typeof(Bitmap));
data.Columns.Add("X", typeof(double));
//循环每行图片进行拼接
Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
for (int a = 0; a < total_dt_X.Rows.Count; a++)
{
DataRow dr2 = data.NewRow();
Graphics g = Graphics.FromImage(bitmap);
g.Clear(Color.White);
g.Dispose();
dr2["mat"] = bitmap;
dr2["X"] = total_dt_X.Rows[a]["X"];
data.Rows.Add(dr2);
}
//循环所有图片
foreach (var f in m_list_allDfield)
{
if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
{
//循环图片的行数
for (int c = 0; c < data.Rows.Count; c++)
{
if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
{
Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
Graphics g2 = Graphics.FromImage(image);
Color color1 = Color.FromArgb(217, 217, 217);
g2.Clear(color1);
g2.DrawImage(image, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
Graphics graph_2 = Graphics.FromImage(image);
for (int a = 0; a < fieldlist.Count; a++)
{
if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
{
//先获取该Field中的所有Particle
List list_particle;
list_particle = fieldlist[a].ParticleList;
//再循环计算所有的Particle对象
foreach (Particle particle in list_particle)
{
List list_seg;
list_seg = particle.SegmentList;
//创建颗粒分布图对应的类对象
List list_dsegment = new List();
//再循环取出里面所有的segment
foreach (Segment seg in list_seg)
{
#region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
System.Drawing.Point on_p = new System.Drawing.Point() { X = seg.Start, Y = seg.Height };
System.Drawing.Point off_p = new System.Drawing.Point() { X = seg.Start + seg.Length, Y = seg.Height };
Pen npen = new Pen(Color.FromArgb(255 - particle.AveGray, 0, 0, 0));
graph_2.DrawLine(npen, on_p, off_p);
#endregion
}
}
}
}
data.Rows[c]["mat"] = image;
data.Rows[c]["X"] = f.OTSCoordinatePos.X;
}
}
}
}
DataView dataView1 = data.DefaultView;
dataView1.Sort = "X ASC";
data = dataView1.ToTable();
list_dt_picdata.Add(data);
}
return list_dt_picdata;
}
///
/// 图像拼接并进行颗粒渲染颜色
///
///
///
///
public List ImageStitchingParticleRendering(ResultFile resultFile, List m_list_allDfield)
{
List list_dt_picdata = new List();
DataTable picDatat = new DataTable();
List fieldlist = resultFile.List_OTSField;
picDatat.Columns.Add("X", typeof(double));
picDatat.Columns.Add("Y", typeof(double));
foreach (var f in m_list_allDfield)
{
DataRow dr = picDatat.NewRow();
dr["X"] = f.OTSCoordinatePos.X;
dr["Y"] = f.OTSCoordinatePos.Y;
picDatat.Rows.Add(dr);
}
DataTable total_dt_X = picDatat.Copy();
DataView dv_x = total_dt_X.DefaultView;
DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
dv_x_2.Sort = "X ASC";
total_dt_X = dv_x_2.ToTable();
DataTable total_dt_Y = picDatat.Copy();
DataView dv_Y = total_dt_Y.DefaultView;
DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
dv_Y_2.Sort = "Y ASC";
total_dt_Y = dv_Y_2.ToTable();
picYmin = Convert.ToDouble(total_dt_Y.Rows[total_dt_Y.Rows.Count - 1]["Y"]);
picXmin = Convert.ToDouble(total_dt_X.Rows[0]["X"]);
for (int i = 0; i < total_dt_Y.Rows.Count; i++)
{
NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
DataTable data = new DataTable();
data.Columns.Add("mat", typeof(Bitmap));
data.Columns.Add("X", typeof(double));
data.Columns.Add("Y", typeof(double));
imgeH = (int)m_list_allDfield[0].OriginalImage.Height;
imgeW = (int)m_list_allDfield[0].OriginalImage.Width;
Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
for (int a = 0; a < total_dt_X.Rows.Count; a++)
{
DataRow dr2 = data.NewRow();
Graphics g = Graphics.FromImage(bitmap);
g.Clear(Color.White);
g.Dispose();
dr2["mat"] = bitmap;
dr2["X"] = total_dt_X.Rows[a]["X"];
data.Rows.Add(dr2);
}
foreach (var f in m_list_allDfield)
{
if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
{
for (int c = 0; c < data.Rows.Count; c++)
{
if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
{
Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
Graphics graph_2 = Graphics.FromImage(image);
Color color1 = Color.FromArgb(217, 217, 217);
graph_2.Clear(color1);
//Color color1 = Color.FromArgb(217, 217, 217);
//graph_2.Clear(color1);
for (int a = 0; a < fieldlist.Count; a++)
{
if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
{
//先获取该Field中的所有Particle
List list_particle;
list_particle = fieldlist[a].ParticleList;
//再循环计算所有的Particle对象
foreach (Particle particle in list_particle)
{
List list_seg;
list_seg = particle.SegmentList;
//创建颗粒分布图对应的类对象
List list_dsegment = new List();
//再循环取出里面所有的segment
foreach (Segment seg in list_seg)
{
#region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
System.Drawing.Point on_p = new System.Drawing.Point() { X = seg.Start, Y = seg.Height };
System.Drawing.Point off_p = new System.Drawing.Point() { X = seg.Start + seg.Length, Y = seg.Height };
var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
Pen npen = new Pen(color);
graph_2.DrawLine(npen, on_p, off_p);
#endregion
}
}
}
}
data.Rows[c]["mat"] = image;
data.Rows[c]["X"] = f.OTSCoordinatePos.X;
data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
}
}
}
}
DataView dataView1 = data.DefaultView;
dataView1.Sort = "X ASC";
data = dataView1.ToTable();
list_dt_picdata.Add(data);
}
return list_dt_picdata;
}
public Mat DrawingOfNationalStandardBoxes(DataTable GBDatatableOne,int GridLength, Mat save_pano)
{
// 创建一个HashSet来存储唯一的值
HashSet distinctValuesY = new HashSet();
// 创建一个HashSet来存储唯一的值
HashSet distinctValuesX = new HashSet();
for (int i = 0; i < GBDatatableOne.Rows.Count; i++)
{
distinctValuesY.Add(Convert.ToInt32(GBDatatableOne.Rows[i]["fieldY"]));
distinctValuesX.Add(Convert.ToInt32(GBDatatableOne.Rows[i]["fieldX"]));
}
//OTS坐标向上为正,向右为正
var distinctY = distinctValuesY.ToList();
distinctY.Sort((a, b) => b.CompareTo(a));
var distinctX = distinctValuesX.ToList();
distinctX.Sort();
//取到Y轴图片的最上边的位置
picYmin = picYmin + (imgeH / 2);
int GBY = distinctY.Max() + (GridLength / 2);
int Yzhou = (int)picYmin - GBY;
picXmin = picXmin - (imgeW / 2);
int GBX = distinctX.Min() - (GridLength / 2);
for (int i = 0; i < distinctY.Count; i++)
{
int Xzhou = (int)picXmin - GBX;
DataTable number = CountTheNumberOfX_axes(GBDatatableOne, "fieldY", distinctY[i].ToString());
for (int j = 0; j < number.Rows.Count; j++)
{
// 定义矩形的左上角和右下角坐标
OpenCvSharp.Point topLeft = new OpenCvSharp.Point(Xzhou, Yzhou);
int XzhouDOW = Xzhou + GridLength;
int YzhouDOW = Yzhou + GridLength;
OpenCvSharp.Point textOrg = new OpenCvSharp.Point(Xzhou + 20, Yzhou + 70); // 文字开始的位置
OpenCvSharp.Point bottomRight = new OpenCvSharp.Point(XzhouDOW, YzhouDOW);
Xzhou = Xzhou + GridLength;
// 定义矩形的颜色(BGR)和线宽
Scalar color = new OpenCvSharp.Scalar(0, 0, 255, 255); // 蓝色
int thickness = 2;
// 在图像上绘制矩形
Cv2.Rectangle(save_pano, topLeft, bottomRight, color, thickness);
// 设置要绘制的文字及其位置
string text = number.Rows[j]["data"].ToString();
string input = number.Rows[j]["data"].ToString();
double fontScale = 1; // 字体大小缩放因子
int thickness2 = 1; // 字体粗细
// 获取文字的大小,以便我们可以更好地定位它
OpenCvSharp.Size textSize = OpenCvSharp.Cv2.GetTextSize(input, HersheyFonts.HersheySimplex, fontScale, thickness2, out int baseline);
int chunkSize = GridLength / textSize.Height; // 分割长度
// 使用LINQ的Enumerable.Chunk扩展方法分割字符串
var chunks = Enumerable.Range(0, input.Length / chunkSize + (input.Length % chunkSize > 0 ? 1 : 0))
.Select(x => input.Substring(x * chunkSize, Math.Min(chunkSize, input.Length - x * chunkSize)))
.ToList();
int topgrade = Convert.ToInt32(number.Rows[j]["color"]);
// 设置字体样式和大小
Color color1 = new Color();
switch (topgrade)
{
case 0:
color1 = Color.White;
break;
case 1:
color1 = Color.DarkGray;
break;
case 2:
color1 = Color.Purple;
break;
case 3:
color1 = Color.Blue;
break;
case 4:
color1 = Color.Red;
break;
case 5:
color1 = Color.Red;
break;
default:
color1 = Color.Red;
break;
}
Scalar fontColor = new OpenCvSharp.Scalar(color1.B, color1.G, color1.R, 255); // 文字颜色:黑色
LineTypes lineType = OpenCvSharp.LineTypes.AntiAlias; // 线条类型
foreach (var chunk in chunks)
{
// 使用PutText方法在图像上绘制文字
Cv2.PutText(save_pano, chunk, textOrg, HersheyFonts.HersheySimplex, fontScale, fontColor, thickness, lineType);
textOrg.Y = textOrg.Y + 70;
}
}
Yzhou = Yzhou + GridLength;
}
return save_pano;
}
private DataTable CountTheNumberOfX_axes(DataTable dataTable, string ColumnName, string name)
{
DataTable data = new DataTable();
data.Columns.Add("data");
data.Columns.Add("color");
for (int i = 0; i < dataTable.Rows.Count; i++)
{
if (name == dataTable.Rows[i][ColumnName].ToString())
{
DataRow dr = data.NewRow();
dr["data"] = dataTable.Rows[i]["gradeDetail"].ToString();
dr["color"] = dataTable.Rows[i]["topGrade"].ToString();
data.Rows.Add(dr);
}
}
return data;
}
public static Bitmap ParticleBinaryDiagram(DataTable resultFile, int PICSerialNumber,int SerialNumber)
{
DataTable PICData = resultFile.Clone();
for (int i=0;i< resultFile.Rows.Count;i++)
{
if (Convert.ToInt32(resultFile.Rows[i]["FieldId"]) == PICSerialNumber)
{
PICData.Rows.Add(resultFile.Rows[i].ItemArray);
}
}
DataTable SerialData = PICData.Clone();
for (int i=0;i< PICData.Rows.Count;i++)
{
if (Convert.ToInt32(PICData.Rows[i]["ParticleId"])== SerialNumber)
{
SerialData.Rows.Add(PICData.Rows[i].ItemArray);
}
}
HashSet hsINT = new HashSet();
int left = int.MaxValue;
int wide = 0;
int Ht = int.MaxValue;
List vs = new List();
List HList = new List();
for (int i = 0; i < SerialData.Rows.Count; i++)
{
if (left >Convert.ToInt32(SerialData.Rows[i]["Start"]))
{
left = Convert.ToInt32(SerialData.Rows[i]["Start"]);
}
vs.Add(Convert.ToInt32(SerialData.Rows[i]["Start"]) + Convert.ToInt32(SerialData.Rows[i]["Length"]));
hsINT.Add(Convert.ToInt32(SerialData.Rows[i]["Height"]));
HList.Add(Convert.ToInt32(SerialData.Rows[i]["Height"]));
}
for (int i=0;i< vs.Count;i++)
{
vs[i] = vs[i] - left;
if (wide< vs[i])
{
wide = vs[i];
}
}
for (int i=0;i< HList.Count;i++)
{
if (Ht > HList[i])
{
Ht = HList[i];
}
}
Bitmap bitmap = new Bitmap(wide+20, hsINT.Count+30);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.White);
//再循环取出里面所有的segment
for (int i=0;i< SerialData.Rows.Count;i++)
{
#region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
Rectangle rectangle = new Rectangle(Convert.ToInt32(SerialData.Rows[i]["Start"]) - left + 10, Convert.ToInt32(SerialData.Rows[i]["Height"]) - Ht + 10, Convert.ToInt32(SerialData.Rows[i]["Length"]),2);
graphics.FillRectangle(Brushes.Black, rectangle);
#endregion
}
return bitmap;
}
}
}