using OpenCvSharp; using OTSCommon.Model; using OTSIncAReportGraph; using OTSIncAReportGraph.Class; using OTSIncAReportGraph.Controls; using OTSModelSharp.ServiceCenter; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace OTSIncAReportApp._3_ServiceCenter { class OutPIC { public OTSIncAReportApp.frmReportApp m_ReportApp; //包含particle的field的列表对象 public List m_list_allDfield = null; public ResultFile resultFile = null; public SaveFileDialog sfd = null; public DataTable ParticleData = new DataTable(); public DataTable ParticleClassData = new DataTable(); /// /// 国标一框框 /// public DataTable GBDatatableOne { get; set; } /// ///国标格子大小(像素) /// public int GridLength { get; set; } public int type = 0; /// /// 获取每行图片的位置配合opencv方法使用 /// /// private List opencv_piclist() { List list_dt_picdata = new List(); DataTable picDatat = new DataTable(); 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; //dr["X"] = f.GetShowRect().X; //dr["Y"] = f.GetShowRect().Y; picDatat.Rows.Add(dr); } //int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true")); //int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true")); 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)); data.Columns.Add("Y", typeof(double)); for (int a = 0; a < total_dt_X.Rows.Count; a++) { DataRow dr2 = data.NewRow(); Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height); //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height); Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White); g.Dispose(); dr2["mat"] = bitmap; dr2["X"] = total_dt_X.Rows[a]["X"]; //dr2["Y"] = total_dt_X.Rows[a]["Y"]; 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()) { data.Rows[c]["mat"] = f.OriginalImage; 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 void opencv_outpic() { List list_dt_picdata = new List(); OpenCvSharp.Mat[] list_mats; if (type == (int)Outpic_enum.pic) { list_dt_picdata = opencv_piclist(); list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count]; } else if (type == (int)Outpic_enum.Render_pic) { list_dt_picdata = opencv_piclist_Render(); list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count + 1]; } else { list_dt_picdata = NoBackgroundParticleDiagram(); list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count]; } NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......"); List list_pano = new List(); //循环保存每行拼接的图片 for (int i = list_dt_picdata.Count-1; i >= 0; i--) { //拼接同一行中的图片 OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count]; for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++) { mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]); } OpenCvSharp.Mat pano = new OpenCvSharp.Mat(); OpenCvSharp.Cv2.HConcat(mats, pano); list_pano.Add(pano); } //导出原图(渲染图)在下方增加每种颜色的标注和面积占比 if (type == (int)Outpic_enum.Render_pic) { DataTable particleData = ParticleDataIntegration(ParticleData, ParticleClassData); int NumberOfRows = getPICstringLong(particleData, list_pano); Bitmap bitmap = new Bitmap(list_pano[0].Width, NumberOfRows*140); Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White); int rowData = 10; //矩形格子宽500 SolidBrush mysbrush1 = new SolidBrush(ColorTranslator.FromHtml("#000000")); Pen mypen = new Pen(mysbrush1, 2); Font myFont = new Font("宋体", 13, FontStyle.Bold); SolidBrush sbrush = new SolidBrush(Color.Black); int Color_Y = 10; int TypeName_Y = 40; int Prozentsatz_Y = 100;int Area_Y = 70; int Gitter_X = 10; picKopfzeile(mypen, myFont, sbrush, g, 10, rowData); Gitter_X = Gitter_X + 350; for (int i = 0; i < particleData.Rows.Count; i++) { if (Gitter_X+350> list_pano[0].Width) { rowData = rowData + 130; picKopfzeile(mypen, myFont, sbrush, g, 10, rowData); Color_Y = Color_Y + 130; TypeName_Y = TypeName_Y + 130; Prozentsatz_Y = Prozentsatz_Y + 130; Area_Y = Area_Y + 130; Gitter_X = 360; } g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30); g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30); g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30); g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30); SolidBrush mysbrush = new SolidBrush(ColorTranslator.FromHtml(particleData.Rows[i]["Color"].ToString())); g.FillRectangle(mysbrush, Gitter_X + 1, Color_Y + 1, 348, 28); g.DrawString(particleData.Rows[i]["TypeName"].ToString(), myFont, sbrush, Gitter_X + 1, TypeName_Y + 2); g.DrawString(particleData.Rows[i]["Area"].ToString(), myFont, sbrush, Gitter_X + 1, Area_Y + 2); g.DrawString(particleData.Rows[i]["Percentage"].ToString()+"%", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2); Gitter_X = Gitter_X + 350; } g.Dispose(); OpenCvSharp.Mat pano = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap); list_pano.Add(pano); } for (int i = 0; i < list_pano.Count; i++) { list_mats[i] = list_pano[i]; } NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed."); NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......"); OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat(); OpenCvSharp.Cv2.VConcat(list_mats, save_pano); if (type == (int)Outpic_enum.GBOne) { // 创建一个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"])); } int picdataYmin = Convert.ToInt32(list_dt_picdata[0].Rows[0]["Y"]); int picdataXmin = Convert.ToInt32(list_dt_picdata[0].Rows[0]["X"]); var distinctY = distinctValuesY.ToList(); distinctY.Sort(); var distinctX = distinctValuesX.ToList(); distinctX.Sort(); int Yzhou = (distinctY[0] - picdataYmin); for (int i = 0; i < distinctY.Count; i++) { int Xzhou = (distinctX[0] - picdataXmin); 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)和线宽 OpenCvSharp.Scalar color = new OpenCvSharp.Scalar(0, 0, 255, 255); // 蓝色 int thickness = 10; // 在图像上绘制矩形 OpenCvSharp.Cv2.Rectangle(save_pano, topLeft, bottomRight, color, thickness); // 设置要绘制的文字及其位置 string text = number.Rows[i]["data"].ToString(); string input = number.Rows[i]["data"].ToString(); int chunkSize = 40; // 分割长度 // 使用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(); // 输出分割后的子字符串 //foreach (var chunk in chunks) //{ // Console.WriteLine(chunk); //} int topgrade = Convert.ToInt32(number.Rows[i]["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; } OpenCvSharp.Scalar fontColor = new OpenCvSharp.Scalar(color1.R, color1.G, color1.B, 255); // 文字颜色:黑色 double fontScale = 2.5; // 字体大小缩放因子 //int thickness = 2; // 字体粗细 OpenCvSharp.LineTypes lineType = OpenCvSharp.LineTypes.AntiAlias; // 线条类型 int thickness2 = 1; // 字体粗细 foreach (var chunk in chunks) { // 获取文字的大小,以便我们可以更好地定位它 OpenCvSharp.Size textSize = OpenCvSharp.Cv2.GetTextSize(chunk, HersheyFonts.HersheySimplex, fontScale, thickness2, out int baseline); // 使用PutText方法在图像上绘制文字 OpenCvSharp.Cv2.PutText(save_pano, chunk, textOrg, HersheyFonts.HersheySimplex, fontScale, fontColor, thickness, lineType); textOrg.Y = textOrg.Y + 100; } } Yzhou = Yzhou + GridLength; } } OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano); NLog.LogManager.GetCurrentClassLogger().Info("Save complete."); Control_DrawDistrbutionImageAndBSE v = m_ReportApp.im_Control_DrawDistrbutionImageAndBSE; MyEvent += new MyEntrust(v.msgInform); v.Invoke(MyEvent); } 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]["grade"].ToString(); dr["color"] = dataTable.Rows[i]["topGrade"].ToString(); data.Rows.Add(dr); } } return data; } private int getPICstringLong(DataTable particleData, List list_pano) { int Long = 1; int Gitter_X = 10; for (int i = 0; i < particleData.Rows.Count; i++) { if (Gitter_X + 350 > list_pano[0].Width) { Long = Long + 1; Gitter_X = 10; } Gitter_X = Gitter_X + 350; } return Long; } private void picKopfzeile(Pen mypen, Font myFont, SolidBrush sbrush, Graphics g ,int X,int Y) { int Color_Y = Y; int TypeName_Y = Y+30; int Prozentsatz_Y = Y + 90; int Area_Y = Y+ 60; int Gitter_X = X; g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30); g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30); g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30); g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30); g.DrawString("Color", myFont, sbrush, Gitter_X + 1, Color_Y + 2); g.DrawString("TypeName", myFont, sbrush, Gitter_X + 1, TypeName_Y + 2); g.DrawString("Area", myFont, sbrush, Gitter_X + 1, Area_Y + 2); g.DrawString("Prozentsatz", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2); } private DataTable ParticleDataIntegration(DataTable ParticleAll,DataTable ParticleClass) { DataTable dt = ParticleClass.Copy(); dt.Columns.Add("Area", typeof(float)); dt.Columns.Add("Percentage"); dt.Columns.Add("Color"); double ParticleAreaTotal = 0; for (int i=0;i< ParticleAll.Rows.Count;i++) { ParticleAreaTotal = ParticleAreaTotal + Convert.ToDouble(ParticleAll.Rows[i]["Area"]); } for (int i=0;i< dt.Rows.Count;i++) { double ParticleArea = 0; string ParticleColer = ""; for (int a=0;a< ParticleAll.Rows.Count;a++) { if (dt.Rows[i]["TypeName"].ToString()== ParticleAll.Rows[a]["TypeName"].ToString()) { ParticleArea = ParticleArea + Convert.ToDouble(ParticleAll.Rows[a]["Area"]); ParticleColer = ParticleAll.Rows[a]["TypeColor"].ToString(); } } dt.Rows[i]["Area"] = ParticleArea; dt.Rows[i]["Percentage"] = ParameterNormalization(ParticleAreaTotal, ParticleArea); dt.Rows[i]["Color"] = ParticleColer; } return dt; } /// /// 参数归一化 /// /// 总数 /// 传参 /// private string ParameterNormalization(double a_mi, double m) { double ColVal = Convert.ToDouble(m / a_mi * 100); if (ColVal == 0) { return ""; } else { return Math.Round(ColVal, 2).ToString(); } } private List NoBackgroundParticleDiagram() { 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(); //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height); 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); //g2.Clear(Color.White); 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 }; //var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage("#434343", particle.TypeId); 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; } private List opencv_piclist_Render() { 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)); //循环每行图片进行拼接 for (int a = 0; a < total_dt_X.Rows.Count; a++) { DataRow dr2 = data.NewRow(); Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height); //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height); 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(f.OriginalImage.Width, f.OriginalImage.Height); Graphics g2 = Graphics.FromImage(image); g2.DrawImage(f.OriginalImage, 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 }; 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; } } } } DataView dataView1 = data.DefaultView; dataView1.Sort = "X ASC"; data = dataView1.ToTable(); list_dt_picdata.Add(data); } return list_dt_picdata; } #region 合并天宇颗粒融合新增函数 public void opencv_outpic2(/*int type*/) { List list_dt_picdata = new List(); if (type == (int)Outpic_enum.pic || type == (int)Outpic_enum.Combin) { list_dt_picdata = opencv_piclist2(); } else if (type == (int)Outpic_enum.Render_pic || type == (int)Outpic_enum.Render_Combin) { list_dt_picdata = opencv_piclist_Render2(); } OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat(); OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count]; if (type == (int)Outpic_enum.Combin || type == (int)Outpic_enum.Render_Combin) { CImageHandler cImageHandler = new CImageHandler(); Dictionary sampleMembers = ((Dictionary)((Dictionary)resultFile.ResultInfo["Sample"])["Members"]); Dictionary imageProcessParam = (Dictionary)((Dictionary)((Dictionary)sampleMembers["MsrParams"])["Members"])["ImageProcessParam"]; object strOverlapParam = ""; imageProcessParam.TryGetValue("OverlapParam", out strOverlapParam); if (strOverlapParam == null) { NLog.LogManager.GetCurrentClassLogger().Info("There are no overlapping dimensions"); return; } int OverlapParam = int.Parse(strOverlapParam.ToString()); List maxXList = new List(); for (int i = 0; i < list_dt_picdata.Count; i++) { OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count]; for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++) { mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]); } //横向拼接 maxXList.Add(cImageHandler.CombinImageX(mats, OverlapParam, type)); } save_pano = cImageHandler.CombinImageY(maxXList.ToArray(), OverlapParam, type); OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano); NLog.LogManager.GetCurrentClassLogger().Info("Save complete."); } else { NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......"); for (int i = 0; i < list_dt_picdata.Count; i++) { OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count]; for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++) { mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]); } OpenCvSharp.Mat pano = new OpenCvSharp.Mat(); OpenCvSharp.Cv2.HConcat(mats, pano); list_mats[i] = pano; } NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed."); NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......"); OpenCvSharp.Cv2.VConcat(list_mats, save_pano); OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano); NLog.LogManager.GetCurrentClassLogger().Info("Save complete."); } } private List opencv_piclist_Render2() { 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.GetShowRect().X; dr["Y"] = f.GetShowRect().Y; picDatat.Rows.Add(dr); } int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true")); int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true")); 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)); for (int a = 0; a < total_dt_X.Rows.Count; a++) { DataRow dr2 = data.NewRow(); Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height); 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.GetShowRect().Y.ToString()) { for (int c = 0; c < data.Rows.Count; c++) { if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString()) { Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height); Graphics g2 = Graphics.FromImage(image); g2.DrawImage(f.OriginalImage, 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) { //创建DParticle颗粒 DisplayParticle dp = new DisplayParticle(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(dp.Color); graph_2.DrawLine(npen, on_p, off_p); #endregion } } } } data.Rows[c]["mat"] = image; data.Rows[c]["X"] = f.GetShowRect().X; } } } } DataView dataView1 = data.DefaultView; dataView1.Sort = "X ASC"; data = dataView1.ToTable(); list_dt_picdata.Add(data); } return list_dt_picdata; } /// /// 获取每行图片的位置配合opencv方法使用 /// /// private List opencv_piclist2() { List list_dt_picdata = new List(); DataTable picDatat = new DataTable(); 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.GetShowRect().X; dr["Y"] = f.GetShowRect().Y; picDatat.Rows.Add(dr); } int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true")); int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true")); 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)); for (int a = 0; a < total_dt_X.Rows.Count; a++) { DataRow dr2 = data.NewRow(); Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height); 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.GetShowRect().Y.ToString()) { for (int c = 0; c < data.Rows.Count; c++) { if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString()) { data.Rows[c]["mat"] = f.OriginalImage; data.Rows[c]["X"] = f.GetShowRect().X; } } } } DataView dataView1 = data.DefaultView; dataView1.Sort = "X ASC"; data = dataView1.ToTable(); list_dt_picdata.Add(data); } return list_dt_picdata; } #endregion public delegate void MyEntrust(); public event MyEntrust MyEvent; } }