Переглянути джерело

优化报告程序图片拼接导出的优化

zhangjiaxin 1 рік тому
батько
коміт
1149244c25

+ 2 - 1
Bin/x64/Debug/Config/ReportTemplate/Inca_Template/ReportTemplateConfig.xml

@@ -119,9 +119,10 @@
       <YS0>C</YS0>
     </list_str_kllb_qcys>
     <str_kllb_qcys>C</str_kllb_qcys>
-    <str_kllb_DeleteClass>misc</str_kllb_DeleteClass>
+    <str_kllb_DeleteClass>misc,Other Particles</str_kllb_DeleteClass>
     <list_str_kllb_DeleteClass>
       <YS0>misc</YS0>
+      <YS1>Other Particles</YS1>
     </list_str_kllb_DeleteClass>
     <list_int_kllb_number>18</list_int_kllb_number>
   </M_KLLBXX>

BIN
Bin/x64/Debug/Config/ReportTemplate/language.db


+ 36 - 1
OTSIncAReportApp/1-UI/Control_Graph/Controls/Control_DrawDistrbutionImageAndBSE.cs

@@ -1429,6 +1429,11 @@ namespace OTSIncAReportGraph.Controls
             //    bThread.Start();
             //}
             SaveFileDialog sfd = new SaveFileDialog();
+
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
+
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -1436,6 +1441,9 @@ namespace OTSIncAReportGraph.Controls
                 ImageExporter outpic = new ImageExporter();
                 outpic.m_list_allDfield = m_list_allDfield;
                 outpic.resultFile = resultFile;
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
+                outpic.pixelSize = imageDisHelper.m_pixelSize;
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.ColoredParticles;
                 outpic.m_ReportApp = m_ReportApp;
@@ -2246,6 +2254,8 @@ namespace OTSIncAReportGraph.Controls
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.noBackground_pic;
                 outpic.m_ReportApp = m_ReportApp;
+
+                outpic.pixelSize = imageDisHelper.m_pixelSize;
                 Thread bThread = new Thread(new ThreadStart(outpic.opencv_outpic));
 
                 bThread.IsBackground = true;
@@ -2575,6 +2585,11 @@ namespace OTSIncAReportGraph.Controls
         {
             SaveFileDialog sfd = new SaveFileDialog();
 
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
+
+
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -2583,6 +2598,12 @@ namespace OTSIncAReportGraph.Controls
                 ImageExporter outpic = new ImageExporter();
                 outpic.GBDatatableOne = datd;
                 outpic.GridLength = Convert.ToInt32(710.0 / imageDisHelper.m_pixelSize);
+
+                outpic.pixelSize = imageDisHelper.m_pixelSize;
+
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
+
                 outpic.m_list_allDfield = m_list_allDfield;
                 outpic.resultFile = resultFile;
                 outpic.sfd = sfd;
@@ -2599,6 +2620,10 @@ namespace OTSIncAReportGraph.Controls
         {
             SaveFileDialog sfd = new SaveFileDialog();
 
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
+
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -2612,6 +2637,11 @@ namespace OTSIncAReportGraph.Controls
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.GBOne;
                 outpic.m_ReportApp = m_ReportApp;
+                
+
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
+
                 Thread bThread = new Thread(new ThreadStart(outpic.opencv_outpic));
                 bThread.IsBackground = true;
                 bThread.Start();
@@ -2622,7 +2652,9 @@ namespace OTSIncAReportGraph.Controls
         private void aSTMToolStripMenuItem1_Click(object sender, EventArgs e)
         {
             SaveFileDialog sfd = new SaveFileDialog();
-
+            var particledata = new ParticleData(resultFile.FilePath);
+            DataTable ParticleAll = particledata.GetParticleTypeInformation();
+            DataTable ParticleClass = particledata.GetParticleClassAll();
             sfd.Filter = "png Files(*.png)| *.png |BMP Files(*.bmp)| *.bmp |JPG Files(*.jpg)|*.jpg;*.jpeg";
             if (sfd.ShowDialog() == DialogResult.OK)
             {
@@ -2636,6 +2668,9 @@ namespace OTSIncAReportGraph.Controls
                 outpic.sfd = sfd;
                 outpic.type = (int)Outpic_enum.GBOne;
                 outpic.m_ReportApp = m_ReportApp;
+
+                outpic.ParticleData = ParticleAll.Copy();
+                outpic.ParticleClassData = ParticleClass.Copy();
                 Thread bThread = new Thread(new ThreadStart(outpic.opencv_outpic));
                 bThread.IsBackground = true;
                 bThread.Start();

+ 119 - 580
OTSIncAReportApp/1-UI/Control_Graph/Controls/ImageExporter.cs

@@ -1,5 +1,7 @@
 using OpenCvSharp;
+using OpenCvSharp.Extensions;
 using OTSCommon.Model;
+using OTSIncAReportApp._1_UI.Control_Graph.Controls;
 using OTSIncAReportGraph;
 using OTSIncAReportGraph.Class;
 using OTSIncAReportGraph.Controls;
@@ -34,244 +36,60 @@ namespace OTSIncAReportApp._3_ServiceCenter
         /// </summary>
         public int GridLength { get; set; }
         public int type = 0;
+        //像素大小
+        public double pixelSize = 0;
 
-        private double picYmin = 0;
+      
         private double picGBYmin = 0;
-        private int imgeH = 0;
-        private int imgeW = 0;
-        /// <summary>
-        /// 获取每行图片的位置配合opencv方法使用
-        /// </summary>
-        /// <returns></returns>
-        private List<DataTable> opencv_piclist()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            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;
-                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();
+        private double OverlapParamPX = 0;
+   
+   
 
 
-            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();
+        public void opencv_outpic()
+        {
 
+            ImageSplicer imageSplicer = new ImageSplicer();
 
-            for (int i = 0; i < total_dt_Y.Rows.Count; i++)
+            Dictionary<string, object> sampleMembers = ((Dictionary<string, object>)((Dictionary<string, object>)resultFile.ResultInfo["Sample"])["Members"]);
+            Dictionary<string, object> imageProcessParam = (Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)sampleMembers["MsrParams"])["Members"])["ImageProcessParam"];
+            object strOverlapParam = "";
+            imageProcessParam.TryGetValue("OverlapParam", out strOverlapParam);
+            if (strOverlapParam == null)
             {
-                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);
-
-                    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())
-                            {
-                                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);
+                NLog.LogManager.GetCurrentClassLogger().Info("There are no overlapping dimensions");
+                return;
             }
+            //获取图像重叠参数(微米需要转换成像素)
+            int OverlapParam = int.Parse(strOverlapParam.ToString());
 
-            return list_dt_picdata;
-        }
-
-        private List<DataTable> color_piclist()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            DataTable picDatat = new DataTable();
-            List<Field> fieldlist = resultFile.List_OTSField;
-            picDatat.Columns.Add("X", typeof(double));
-            picDatat.Columns.Add("Y", typeof(double));
-            foreach (var f in m_list_allDfield)
+            if (OverlapParam==0)
             {
-                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[0]["Y"]);
-
-            for (int i = 0; i < total_dt_Y.Rows.Count; i++)
+                OverlapParamPX = 0;
+            }else
             {
-                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<Particle> list_particle;
-                                        list_particle = fieldlist[a].ParticleList;
-                                        //再循环计算所有的Particle对象
-                                        foreach (Particle particle in list_particle)
-                                        {
-                                            List<Segment> list_seg;
-                                            list_seg = particle.SegmentList;
-                                            //创建颗粒分布图对应的类对象
-                                            List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
-                                            //再循环取出里面所有的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);
+                OverlapParamPX = OverlapParam / pixelSize;
             }
 
-            return list_dt_picdata;
-        }
-
-
-        public void opencv_outpic()
-        {
-
-            
             List<DataTable> list_dt_picdata = new List<DataTable>();
             OpenCvSharp.Mat[] list_mats;
-            if (type == (int)Outpic_enum.pic)
+            //导出拼接图片外加颗粒渲染
+            if (type ==(int)Outpic_enum.ColoredParticles)
             {
-                list_dt_picdata = opencv_piclist();
+                list_dt_picdata = imageSplicer.ImageStitchingParticleRendering(resultFile, m_list_allDfield);
                 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 if (type == (int)Outpic_enum.GBOne)
             {
-                list_dt_picdata = color_piclist();
+                list_dt_picdata = imageSplicer.ImageStitchingParticleRendering(resultFile, m_list_allDfield);
                 list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
             }
-            //导出没背景颗粒渲染的图
-            else if (type == (int)Outpic_enum.ColoredParticles)
-            {
-                list_dt_picdata = color_piclist();
-                list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
-            }
-            //导出没背景有颗粒的图
+            //导出拼接图片
             else
             {
-                list_dt_picdata = NoBackgroundParticleDiagram();
+                list_dt_picdata = imageSplicer.Mosaics(resultFile, m_list_allDfield);
                 list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
             }
 
@@ -279,40 +97,58 @@ namespace OTSIncAReportApp._3_ServiceCenter
             NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
 
             List<OpenCvSharp.Mat> list_pano = new List<OpenCvSharp.Mat>();
-
+            List<Bitmap> list_panos = new List<Bitmap>();
             //循环保存每行拼接的图片
             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++)
+                // 计算新Bitmap的总宽度和高度  
+                int totalWidth = 0;
+                int maxHeight = 0;
+                for ( int c=0;c< list_dt_picdata[i].Rows.Count;c++)
+                {
+                    Bitmap bitmap = (Bitmap)list_dt_picdata[i].Rows[c]["mat"];
+                    totalWidth += bitmap.Width; // 减去重叠部分将在绘制时处理  
+                    maxHeight = Math.Max(maxHeight, bitmap.Height);
+                }
+                // 因为有n张图片,它们之间会有n-1个重叠区域,所以需要从总宽度中减去这些重叠的像素  
+                // 注意:如果图片数量小于2,则不需要减去任何重叠部分  
+                if (list_dt_picdata[i].Rows.Count > 1)
                 {
-                    mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
+                    totalWidth -= (list_dt_picdata[i].Rows.Count - 1) * (int)OverlapParamPX;
                 }
-                OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
-                
-                OpenCvSharp.Cv2.HConcat(mats, pano);
-                list_pano.Add(pano);
-             
+                // 创建一个新的Bitmap对象来存储拼接后的图像  
+                Bitmap combinedImage = new Bitmap(totalWidth, maxHeight);
 
+                // 使用Graphics对象来绘制拼接后的图像  
+                using (Graphics g = Graphics.FromImage(combinedImage))
+                {
+                    int currentX = 0;
+                    for (int b=0;b< list_dt_picdata[i].Rows.Count; b++)
+                    {
+                        Bitmap bitmap = (Bitmap)list_dt_picdata[i].Rows[b]["mat"];
+                        // 绘制当前图片,注意调整X坐标以实现重叠  
+                        g.DrawImage(bitmap, new Rectangle(currentX, 0, bitmap.Width, bitmap.Height));
+
+                        // 更新当前X坐标,为下一张图片留出空间(包括重叠部分)  
+                        currentX += bitmap.Width - (list_dt_picdata[i].Rows.Count > 1 ? (int)OverlapParamPX : 0); // 如果不是最后一张图片,则减去重叠的20像素  
+                    }
+                }
+                Mat mat = BitmapConverter.ToMat(combinedImage);
+                list_pano.Add(mat);
+                list_panos.Add(combinedImage);
             }
            
 
             //导出原图(渲染图)在下方增加每种颜色的标注和面积占比
-            if (type == (int)Outpic_enum.Render_pic /*|| type == (int)Outpic_enum.GBOne*/)
+            if (type == (int)Outpic_enum.ColoredParticles || type == (int)Outpic_enum.GBOne)
             {
                 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);
@@ -320,7 +156,6 @@ namespace OTSIncAReportApp._3_ServiceCenter
                 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++)
                 {
@@ -347,120 +182,20 @@ namespace OTSIncAReportApp._3_ServiceCenter
 
                     Gitter_X = Gitter_X + 350;
                 }
-
+                list_panos.Add(bitmap);
                 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];
             }
-
+            Bitmap combined = MergeImagesVertically(list_panos, (int)OverlapParamPX);
             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.Mat save_pano = BitmapConverter.ToMat(combined);
+          
             if (type == (int)Outpic_enum.GBOne)
             {
-                // 创建一个HashSet来存储唯一的值  
-                HashSet<int> distinctValuesY = new HashSet<int>();
-                // 创建一个HashSet来存储唯一的值  
-                HashSet<int> distinctValuesX = new HashSet<int>();
-                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((a, b) => b.CompareTo(a));
-                var distinctX = distinctValuesX.ToList();
-                distinctX.Sort();
-
-                //int Yzhou = 0;
-                int Yzhou = (int)picYmin- distinctY.Min();
-                Yzhou = Yzhou + (GridLength / 2) + (imgeH / 2);
-                for (int i = 0; i < distinctY.Count; i++)
-                {
-                    int Xzhou = +(GridLength / 2) /*+ (imgeW / 2)*/;
-                    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 = 2;
-                        // 在图像上绘制矩形  
-                        OpenCvSharp.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;
-
-                        }
-                        OpenCvSharp.Scalar fontColor = new OpenCvSharp.Scalar(color1.B, color1.G, color1.R, 255); // 文字颜色:黑色  
-                        OpenCvSharp.LineTypes lineType = OpenCvSharp.LineTypes.AntiAlias; // 线条类型  
-
-                        foreach (var chunk in chunks)
-                        {
-                            // 使用PutText方法在图像上绘制文字  
-                            OpenCvSharp.Cv2.PutText(save_pano, chunk, textOrg, HersheyFonts.HersheySimplex, fontScale, fontColor, thickness, lineType);
-                            textOrg.Y = textOrg.Y + 70;
-                        }
-                    }
-                    Yzhou = Yzhou + GridLength;
-                }
+                imageSplicer.DrawingOfNationalStandardBoxes(GBDatatableOne, GridLength, save_pano);
+           
             }
+
             OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
             NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
             Control_DrawDistrbutionImageAndBSE v = m_ReportApp.im_Control_DrawDistrbutionImageAndBSE;
@@ -468,24 +203,60 @@ namespace OTSIncAReportApp._3_ServiceCenter
             v.Invoke(MyEvent);
         }
 
-        private DataTable CountTheNumberOfX_axes(DataTable dataTable, string ColumnName, string name)
+
+        private  Bitmap MergeImagesVertically(List<Bitmap> images, int overlap)
         {
+            if (images == null || images.Count == 0)
+            {
+                throw new ArgumentException("输入的图片数组不能为空或没有元素");
+            }
+
+            // 计算新Bitmap的宽度和高度  
+            int totalWidth = 0;
+            int totalHeight = 0;
+
+            // 找到最宽的宽度  
+            foreach (var img in images)
+            {
+                if (img.Width > totalWidth)
+                {
+                    totalWidth = img.Width;
+                }
+                totalHeight += img.Height - (img != images[images.Count - 1] ? overlap : 0); // 最后一张图片不减去重叠  
+            }
+            //int imgHeight = (int)OverlapParamPX * (images.Count - 1);
+            //totalHeight = images[images.Count-1].Height * images.Count- imgHeight;
+            // 为最后一张图片添加完整的高度  
+            if (images.Count > 1)
+            {
+                totalHeight += images[images.Count - 1].Height;
+            }
+            else
+            {
+                // 如果只有一张图片,则不需要调整高度  
+                totalHeight = images[0].Height;
+            }
+
+            Bitmap result = new Bitmap(totalWidth, totalHeight);
 
-            DataTable data = new DataTable();
-            data.Columns.Add("data");
-            data.Columns.Add("color");
-            for (int i = 0; i < dataTable.Rows.Count; i++)
+            using (Graphics g = Graphics.FromImage(result))
             {
-                if (name == dataTable.Rows[i][ColumnName].ToString())
+                g.Clear(Color.Transparent); // 或者设置为其他背景色  
+
+                int offsetY = 0;
+                foreach (var img in images)
                 {
-                    DataRow dr = data.NewRow();
-                    dr["data"] = dataTable.Rows[i]["gradeDetail"].ToString();
-                    dr["color"] = dataTable.Rows[i]["topGrade"].ToString();
-                    data.Rows.Add(dr);
+                    // 绘制图片,考虑重叠部分  
+                    g.DrawImage(img, new Rectangle(0, offsetY, img.Width, img.Height));
+
+                    // 更新偏移量  
+                    offsetY += img.Height - (img != images[images.Count - 1] ? overlap : 0);
                 }
             }
-            return data;
+
+            return result;
         }
+
         private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
         {
             int Long = 1;
@@ -569,238 +340,6 @@ namespace OTSIncAReportApp._3_ServiceCenter
 
         }
 
-        private List<DataTable> NoBackgroundParticleDiagram()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            DataTable picDatat = new DataTable();
-            List<Field> 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);
-                                //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<Particle> list_particle;
-                                        list_particle = fieldlist[a].ParticleList;
-                                        //再循环计算所有的Particle对象
-                                        foreach (Particle particle in list_particle)
-                                        {
-                                            List<Segment> list_seg;
-                                            list_seg = particle.SegmentList;
-                                            //创建颗粒分布图对应的类对象
-                                            List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
-                                            //再循环取出里面所有的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;
-        }
-
-        private List<DataTable> opencv_piclist_Render()
-        {
-            List<DataTable> list_dt_picdata = new List<DataTable>();
-            DataTable picDatat = new DataTable();
-            List<Field> 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<Particle> list_particle;
-                                        list_particle = fieldlist[a].ParticleList;
-                                        //再循环计算所有的Particle对象
-                                        foreach (Particle particle in list_particle)
-                                        {
-                                          
-                                         
-                                            List<Segment> list_seg;
-                                            list_seg = particle.SegmentList;
-                                            //创建颗粒分布图对应的类对象
-                                            List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
-                                            //再循环取出里面所有的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*/)
         {

+ 398 - 0
OTSIncAReportApp/1-UI/Control_Graph/Controls/ImageSplicer.cs

@@ -0,0 +1,398 @@
+using OpenCvSharp;
+using OpenCvSharp.Extensions;
+using OTSCommon.Model;
+using OTSIncAReportGraph;
+using OTSIncAReportGraph.Class;
+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; }
+        /// <summary>
+        /// 单纯图像拼接无颗粒颜色渲染
+        /// </summary>
+        /// <param name="resultFile"></param>
+        /// <param name="m_list_allDfield"></param>
+        /// <returns></returns>
+        public List<DataTable> Mosaics(ResultFile resultFile,List<DisplayRectangle> m_list_allDfield)
+        {
+            List<DataTable> list_dt_picdata = new List<DataTable>();
+            DataTable picDatat = new DataTable();
+            List<Field> 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);
+                                //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<Particle> list_particle;
+                                        list_particle = fieldlist[a].ParticleList;
+                                        //再循环计算所有的Particle对象
+                                        foreach (Particle particle in list_particle)
+                                        {
+                                            List<Segment> list_seg;
+                                            list_seg = particle.SegmentList;
+                                            //创建颗粒分布图对应的类对象
+                                            List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
+                                            //再循环取出里面所有的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;
+        }
+        /// <summary>
+        /// 图像拼接并进行颗粒渲染颜色
+        /// </summary>
+        /// <param name="resultFile"></param>
+        /// <param name="m_list_allDfield"></param>
+        /// <returns></returns>
+        public List<DataTable> ImageStitchingParticleRendering(ResultFile resultFile, List<DisplayRectangle> m_list_allDfield)
+        {
+            List<DataTable> list_dt_picdata = new List<DataTable>();
+            DataTable picDatat = new DataTable();
+            List<Field> 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<Particle> list_particle;
+                                        list_particle = fieldlist[a].ParticleList;
+                                        //再循环计算所有的Particle对象
+                                        foreach (Particle particle in list_particle)
+                                        {
+                                            List<Segment> list_seg;
+                                            list_seg = particle.SegmentList;
+                                            //创建颗粒分布图对应的类对象
+                                            List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
+                                            //再循环取出里面所有的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<int> distinctValuesY = new HashSet<int>();
+            // 创建一个HashSet来存储唯一的值  
+            HashSet<int> distinctValuesX = new HashSet<int>();
+            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;
+        }
+    }
+}

+ 3 - 1
OTSIncAReportApp/1-UI/OTSReportExport/Template/DataTemplate.cs

@@ -108,11 +108,13 @@ namespace OTSIncAReportApp._1_UI.OTSTemplateDesigner
      
             //夹杂物面积比图
             setXRLabelData(xrLabel_inca_pic_class, GetlanguageData(xrLabel_inca_pic_class.Name.ToString(), languageData));//夹杂物面积比图
+            setXRLabelData(xrLabel_inca_pic_subdivision, GetlanguageData(xrLabel_inca_pic_subdivision.Name.ToString(), languageData));
+            //setXRLabelData(xrLabel_size_IconQuestion_Subdivision, GetlanguageData(xrLabel_size_IconQuestion_Subdivision.Name.ToString(), languageData));
             //setXRLabelData(xrTableCell1, GetlanguageData(xrTableCell1.Name.ToString(), languageData));//备注
             setXRLabelData(xrTableCell1, "Notes");//备注
             //颗粒尺寸表
             //Bitmap bitmap = (Bitmap)Image.FromFile(str3 + "\\Config\\ReportTemplate\\ReportIdentification.bmp");
-            setXRLabelData(xrLabel_inca_pic_class, GetlanguageData(xrLabel_inca_pic_class.Name.ToString(), languageData));
+            //setXRLabelData(xrLabel_inca_pic_class, GetlanguageData(xrLabel_inca_pic_class.Name.ToString(), languageData));
             Bitmap bitmap = (Bitmap)Image.FromFile(System.IO.Directory.GetCurrentDirectory() + "\\Config\\ReportTemplate\\"+ TemplateClass.M_SY.LOGName);
             xrPictureBox1.ImageSource = new ImageSource(bitmap);
             xrPictureBox1.Sizing = DevExpress.XtraPrinting.ImageSizeMode.Squeeze;

+ 1 - 0
OTSIncAReportApp/OTSIncAReportApp.csproj

@@ -423,6 +423,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="1-UI\Control_Graph\Controls\ImageSplicer.cs" />
     <Compile Include="1-UI\Control_Grids\ParticlesGridDevidePage\ParticlesGridDevidePageShowConfig.cs">
       <SubType>Form</SubType>
     </Compile>