Jelajahi Sumber

图片拼接导出功能

zhangjiaxin 3 tahun lalu
induk
melakukan
f627d716c4

+ 259 - 4
OTSIncAReportApp/1-UI/Control_Graph/Controls/Control_DrawDistrbutionImageAndBSE.cs

@@ -1,4 +1,5 @@
 using NLog;
+
 using OTSIncAReportApp;
 using OTSIncAReportApp.DataOperation.DataAccess;
 using OTSIncAReportApp.DataOperation.Model;
@@ -45,9 +46,15 @@ namespace OTSIncAReportGraph.Controls
       
        MoveSEMToParticle=1,
        CopyImage=2,
-            OriginalSplicing=3
+            OriginalSplicing= 3
 
     }
+    public enum Outpic_enum
+    {
+        pic=0,
+        Render_pic=1
+    }
+
     public partial class Control_DrawDistrbutionImageAndBSE : UserControl
     {
 
@@ -1446,8 +1453,10 @@ namespace OTSIncAReportGraph.Controls
         private void toolStripMenuItem_copyimage_Click(object sender, EventArgs e)
         {
 
-            //outpic();
-            if (outpic())
+            //opencv_outpic();
+            ////outpic();
+            //opencv_outpic();
+            if (opencv_outpic((int)Outpic_enum.pic))
             {
                 MessageBox.Show("Picture export complete");
             }
@@ -2039,6 +2048,251 @@ namespace OTSIncAReportGraph.Controls
             }
             return false;
         }
+        /// <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.Rect.X;
+                dr["Y"] = f.Rect.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++)
+            {
+                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].Rect.Width, (int)m_list_allDfield[0].Rect.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.Rect.Y.ToString())
+                    {
+                        for (int c=0;c<data.Rows.Count;c++)
+                        {
+                            if (data.Rows[c]["X"].ToString()== f.Rect.X.ToString())
+                            {
+                                data.Rows[c]["mat"]= f.OriginalImage;
+                                data.Rows[c]["X"] = f.Rect.X;
+                            }
+                        }
+
+                    }
+                }
+                
+                
+                DataView dataView1 = data.DefaultView;
+                dataView1.Sort = "X ASC";
+                data = dataView1.ToTable();
+
+               
+                list_dt_picdata.Add(data);
+            }
+
+            return list_dt_picdata;
+        }
+        private bool opencv_outpic(int type)
+        {
+            SaveFileDialog sfd = new SaveFileDialog();
+            //|ALL Files(*.*)|*.*
+            //BMP Files(*.bmp)| *.bmp |
+            sfd.Filter = "png Files(*.png)| *.png |JPG Files(*.jpg)|*.jpg;*.jpeg";
+            if (sfd.ShowDialog() == DialogResult.OK)
+            {
+                List<DataTable> list_dt_picdata = new List<DataTable>();
+                if (type==(int)Outpic_enum.pic)
+                {
+                    list_dt_picdata = opencv_piclist();
+                }else
+                    if (type==(int)Outpic_enum.Render_pic)
+                {
+                    list_dt_picdata = opencv_piclist_Render();
+                }
+                //List<DataTable> list_dt_picdata = opencv_piclist();
+                OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
+                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;
+                }
+                OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
+                OpenCvSharp.Cv2.VConcat(list_mats, save_pano);
+                OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
+            }
+
+                return true;
+        }
+        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.Rect.X;
+                dr["Y"] = f.Rect.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++)
+            {
+                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].Rect.Width, (int)m_list_allDfield[0].Rect.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.Rect.Y.ToString())
+                    {
+                        for (int c = 0; c < data.Rows.Count; c++)
+                        {
+                            if (data.Rows[c]["X"].ToString() == f.Rect.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)
+                                        {
+                                            //创建DParticle颗粒
+                                            DisplayParticle dp = new DisplayParticle(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对象中
+
+                                                Point on_p = new Point() { X = seg.Start, Y = seg.Height };
+                                                Point off_p = new 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.Rect.X;
+                            }
+                        }
+                    }
+
+
+
+                    
+                    
+
+
+
+
+
+
+                    //if (total_dt_Y.Rows[i]["Y"].ToString() == f.Rect.Y.ToString())
+                    //{
+                    //    for (int c = 0; c < data.Rows.Count; c++)
+                    //    {
+                    //        if (data.Rows[c]["X"].ToString() == f.Rect.X.ToString())
+                    //        {
+                    //            data.Rows[c]["mat"] = f.OriginalImage;
+                    //            data.Rows[c]["X"] = f.Rect.X;
+                    //        }
+                    //    }
+
+                    //}
+                }
+
+
+                DataView dataView1 = data.DefaultView;
+                dataView1.Sort = "X ASC";
+                data = dataView1.ToTable();
+
+
+                list_dt_picdata.Add(data);
+            }
+
+            return list_dt_picdata;
+        }
+
         private static byte[] ImgtoByte(Image img)
         {
             MemoryStream ms = new MemoryStream();
@@ -2101,7 +2355,8 @@ namespace OTSIncAReportGraph.Controls
 
         private void ExportoriginalspliceToolStripMenuItem_Click(object sender, EventArgs e)
         {
-            if (outpic_Render())
+            if (opencv_outpic((int)Outpic_enum.Render_pic))
+            //if (outpic_Render())
             {
                 MessageBox.Show("Picture export complete");
             }