using OTSCommon.Model; using OTSIncAReportGraph; using OTSIncAReportGraph.Class; using OTSIncAReportGraph.Controls; 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 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); 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 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对象中 Point on_p = new Point() { X = seg.Start, Y = seg.Height }; Point off_p = new 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对象中 Point on_p = new Point() { X = seg.Start, Y = seg.Height }; Point off_p = new 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; } public delegate void MyEntrust(); public event MyEntrust MyEvent; } }