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