OutPIC.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. using OTSCommon.Model;
  2. using OTSIncAReportGraph;
  3. using OTSIncAReportGraph.Class;
  4. using OTSIncAReportGraph.Controls;
  5. using OTSModelSharp.ServiceCenter;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows.Forms;
  14. namespace OTSIncAReportApp._3_ServiceCenter
  15. {
  16. class OutPIC
  17. {
  18. public OTSIncAReportApp.frmReportApp m_ReportApp;
  19. //包含particle的field的列表对象
  20. public List<DisplayField> m_list_allDfield = null;
  21. public ResultFile resultFile = null;
  22. public SaveFileDialog sfd = null;
  23. public DataTable ParticleData = new DataTable();
  24. public DataTable ParticleClassData = new DataTable();
  25. public int type = 0;
  26. /// <summary>
  27. /// 获取每行图片的位置配合opencv方法使用
  28. /// </summary>
  29. /// <returns></returns>
  30. private List<DataTable> opencv_piclist()
  31. {
  32. List<DataTable> list_dt_picdata = new List<DataTable>();
  33. DataTable picDatat = new DataTable();
  34. picDatat.Columns.Add("X", typeof(double));
  35. picDatat.Columns.Add("Y", typeof(double));
  36. foreach (var f in m_list_allDfield)
  37. {
  38. DataRow dr = picDatat.NewRow();
  39. dr["X"] = f.OTSCoordinatePos.X;
  40. dr["Y"] = f.OTSCoordinatePos.Y;
  41. //dr["X"] = f.GetShowRect().X;
  42. //dr["Y"] = f.GetShowRect().Y;
  43. picDatat.Rows.Add(dr);
  44. }
  45. //int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
  46. //int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
  47. DataTable total_dt_X = picDatat.Copy();
  48. DataView dv_x = total_dt_X.DefaultView;
  49. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  50. dv_x_2.Sort = "X ASC";
  51. total_dt_X = dv_x_2.ToTable();
  52. DataTable total_dt_Y = picDatat.Copy();
  53. DataView dv_Y = total_dt_Y.DefaultView;
  54. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  55. dv_Y_2.Sort = "Y ASC";
  56. total_dt_Y = dv_Y_2.ToTable();
  57. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  58. {
  59. NLog.LogManager.GetCurrentClassLogger().Info("Splice line"+i+1.ToString()+"of"+ total_dt_Y.Rows.Count.ToString()+".....");
  60. DataTable data = new DataTable();
  61. data.Columns.Add("mat", typeof(Bitmap));
  62. data.Columns.Add("X", typeof(double));
  63. data.Columns.Add("Y", typeof(double));
  64. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  65. {
  66. DataRow dr2 = data.NewRow();
  67. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  68. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  69. Graphics g = Graphics.FromImage(bitmap);
  70. g.Clear(Color.White);
  71. g.Dispose();
  72. dr2["mat"] = bitmap;
  73. dr2["X"] = total_dt_X.Rows[a]["X"];
  74. //dr2["Y"] = total_dt_X.Rows[a]["Y"];
  75. data.Rows.Add(dr2);
  76. }
  77. foreach (var f in m_list_allDfield)
  78. {
  79. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  80. {
  81. for (int c = 0; c < data.Rows.Count; c++)
  82. {
  83. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  84. {
  85. data.Rows[c]["mat"] = f.OriginalImage;
  86. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  87. data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
  88. }
  89. }
  90. }
  91. }
  92. DataView dataView1 = data.DefaultView;
  93. dataView1.Sort = "X ASC";
  94. data = dataView1.ToTable();
  95. list_dt_picdata.Add(data);
  96. }
  97. return list_dt_picdata;
  98. }
  99. public void opencv_outpic()
  100. {
  101. List<DataTable> list_dt_picdata = new List<DataTable>();
  102. OpenCvSharp.Mat[] list_mats;
  103. if (type == (int)Outpic_enum.pic)
  104. {
  105. list_dt_picdata = opencv_piclist();
  106. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
  107. }
  108. else if (type == (int)Outpic_enum.Render_pic)
  109. {
  110. list_dt_picdata = opencv_piclist_Render();
  111. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count + 1];
  112. }
  113. else
  114. {
  115. list_dt_picdata = NoBackgroundParticleDiagram();
  116. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
  117. }
  118. NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
  119. List<OpenCvSharp.Mat> list_pano = new List<OpenCvSharp.Mat>();
  120. //循环保存每行拼接的图片
  121. for (int i = list_dt_picdata.Count-1; i >= 0; i--)
  122. {
  123. //拼接同一行中的图片
  124. OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count];
  125. for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++)
  126. {
  127. mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
  128. }
  129. OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
  130. OpenCvSharp.Cv2.HConcat(mats, pano);
  131. list_pano.Add(pano);
  132. }
  133. //导出原图(渲染图)在下方增加每种颜色的标注和面积占比
  134. if (type == (int)Outpic_enum.Render_pic)
  135. {
  136. DataTable particleData = ParticleDataIntegration(ParticleData, ParticleClassData);
  137. int NumberOfRows = getPICstringLong(particleData, list_pano);
  138. Bitmap bitmap = new Bitmap(list_pano[0].Width, NumberOfRows*140);
  139. Graphics g = Graphics.FromImage(bitmap);
  140. g.Clear(Color.White);
  141. int rowData = 10;
  142. //矩形格子宽500
  143. SolidBrush mysbrush1 = new SolidBrush(ColorTranslator.FromHtml("#000000"));
  144. Pen mypen = new Pen(mysbrush1, 2);
  145. Font myFont = new Font("宋体", 13, FontStyle.Bold);
  146. SolidBrush sbrush = new SolidBrush(Color.Black);
  147. int Color_Y = 10; int TypeName_Y = 40; int Prozentsatz_Y = 100;int Area_Y = 70;
  148. int Gitter_X = 10;
  149. picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
  150. Gitter_X = Gitter_X + 350;
  151. for (int i = 0; i < particleData.Rows.Count; i++)
  152. {
  153. if (Gitter_X+350> list_pano[0].Width)
  154. {
  155. rowData = rowData + 130;
  156. picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
  157. Color_Y = Color_Y + 130;
  158. TypeName_Y = TypeName_Y + 130;
  159. Prozentsatz_Y = Prozentsatz_Y + 130;
  160. Area_Y = Area_Y + 130;
  161. Gitter_X = 360;
  162. }
  163. g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
  164. g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
  165. g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
  166. g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
  167. SolidBrush mysbrush = new SolidBrush(ColorTranslator.FromHtml(particleData.Rows[i]["Color"].ToString()));
  168. g.FillRectangle(mysbrush, Gitter_X + 1, Color_Y + 1, 348, 28);
  169. g.DrawString(particleData.Rows[i]["TypeName"].ToString(), myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
  170. g.DrawString(particleData.Rows[i]["Area"].ToString(), myFont, sbrush, Gitter_X + 1, Area_Y + 2);
  171. g.DrawString(particleData.Rows[i]["Percentage"].ToString()+"%", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
  172. Gitter_X = Gitter_X + 350;
  173. }
  174. g.Dispose();
  175. OpenCvSharp.Mat pano = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
  176. list_pano.Add(pano);
  177. }
  178. for (int i = 0; i < list_pano.Count; i++)
  179. {
  180. list_mats[i] = list_pano[i];
  181. }
  182. NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed.");
  183. NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......");
  184. OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
  185. OpenCvSharp.Cv2.VConcat(list_mats, save_pano);
  186. OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
  187. NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
  188. Control_DrawDistrbutionImageAndBSE v = m_ReportApp.im_Control_DrawDistrbutionImageAndBSE;
  189. MyEvent += new MyEntrust(v.msgInform);
  190. v.Invoke(MyEvent);
  191. }
  192. private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
  193. {
  194. int Long = 1;
  195. int Gitter_X = 10;
  196. for (int i = 0; i < particleData.Rows.Count; i++)
  197. {
  198. if (Gitter_X + 350 > list_pano[0].Width)
  199. {
  200. Long = Long + 1;
  201. Gitter_X = 10;
  202. }
  203. Gitter_X = Gitter_X + 350;
  204. }
  205. return Long;
  206. }
  207. private void picKopfzeile(Pen mypen, Font myFont, SolidBrush sbrush, Graphics g ,int X,int Y)
  208. {
  209. int Color_Y = Y; int TypeName_Y = Y+30; int Prozentsatz_Y = Y + 90; int Area_Y = Y+ 60;
  210. int Gitter_X = X;
  211. g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
  212. g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
  213. g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
  214. g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
  215. g.DrawString("Color", myFont, sbrush, Gitter_X + 1, Color_Y + 2);
  216. g.DrawString("TypeName", myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
  217. g.DrawString("Area", myFont, sbrush, Gitter_X + 1, Area_Y + 2);
  218. g.DrawString("Prozentsatz", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
  219. }
  220. private DataTable ParticleDataIntegration(DataTable ParticleAll,DataTable ParticleClass)
  221. {
  222. DataTable dt = ParticleClass.Copy();
  223. dt.Columns.Add("Area", typeof(float));
  224. dt.Columns.Add("Percentage");
  225. dt.Columns.Add("Color");
  226. double ParticleAreaTotal = 0;
  227. for (int i=0;i< ParticleAll.Rows.Count;i++)
  228. {
  229. ParticleAreaTotal = ParticleAreaTotal + Convert.ToDouble(ParticleAll.Rows[i]["Area"]);
  230. }
  231. for (int i=0;i< dt.Rows.Count;i++)
  232. {
  233. double ParticleArea = 0;
  234. string ParticleColer = "";
  235. for (int a=0;a< ParticleAll.Rows.Count;a++)
  236. {
  237. if (dt.Rows[i]["TypeName"].ToString()== ParticleAll.Rows[a]["TypeName"].ToString())
  238. {
  239. ParticleArea = ParticleArea + Convert.ToDouble(ParticleAll.Rows[a]["Area"]);
  240. ParticleColer = ParticleAll.Rows[a]["TypeColor"].ToString();
  241. }
  242. }
  243. dt.Rows[i]["Area"] = ParticleArea;
  244. dt.Rows[i]["Percentage"] = ParameterNormalization(ParticleAreaTotal, ParticleArea);
  245. dt.Rows[i]["Color"] = ParticleColer;
  246. }
  247. return dt;
  248. }
  249. /// <summary>
  250. /// 参数归一化
  251. /// </summary>
  252. /// <param name="a_mi">总数</param>
  253. /// <param name="m">传参</param>
  254. /// <returns></returns>
  255. private string ParameterNormalization(double a_mi, double m)
  256. {
  257. double ColVal = Convert.ToDouble(m / a_mi * 100);
  258. if (ColVal == 0)
  259. {
  260. return "";
  261. }
  262. else
  263. {
  264. return Math.Round(ColVal, 2).ToString();
  265. }
  266. }
  267. private List<DataTable> NoBackgroundParticleDiagram()
  268. {
  269. List<DataTable> list_dt_picdata = new List<DataTable>();
  270. DataTable picDatat = new DataTable();
  271. List<Field> fieldlist = resultFile.List_OTSField;
  272. picDatat.Columns.Add("X", typeof(double));
  273. picDatat.Columns.Add("Y", typeof(double));
  274. foreach (var f in m_list_allDfield)
  275. {
  276. DataRow dr = picDatat.NewRow();
  277. dr["X"] = f.OTSCoordinatePos.X;
  278. dr["Y"] = f.OTSCoordinatePos.Y;
  279. picDatat.Rows.Add(dr);
  280. }
  281. DataTable total_dt_X = picDatat.Copy();
  282. DataView dv_x = total_dt_X.DefaultView;
  283. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  284. dv_x_2.Sort = "X ASC";
  285. total_dt_X = dv_x_2.ToTable();
  286. DataTable total_dt_Y = picDatat.Copy();
  287. DataView dv_Y = total_dt_Y.DefaultView;
  288. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  289. dv_Y_2.Sort = "Y ASC";
  290. total_dt_Y = dv_Y_2.ToTable();
  291. //循环每一行图片
  292. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  293. {
  294. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  295. DataTable data = new DataTable();
  296. data.Columns.Add("mat", typeof(Bitmap));
  297. data.Columns.Add("X", typeof(double));
  298. //循环每行图片进行拼接
  299. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  300. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  301. {
  302. DataRow dr2 = data.NewRow();
  303. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  304. Graphics g = Graphics.FromImage(bitmap);
  305. g.Clear(Color.White);
  306. g.Dispose();
  307. dr2["mat"] = bitmap;
  308. dr2["X"] = total_dt_X.Rows[a]["X"];
  309. data.Rows.Add(dr2);
  310. }
  311. //循环所有图片
  312. foreach (var f in m_list_allDfield)
  313. {
  314. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  315. {
  316. //循环图片的行数
  317. for (int c = 0; c < data.Rows.Count; c++)
  318. {
  319. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  320. {
  321. Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);
  322. Graphics g2 = Graphics.FromImage(image);
  323. //g2.Clear(Color.White);
  324. Color color1 = Color.FromArgb(217, 217, 217);
  325. g2.Clear(color1);
  326. g2.DrawImage(image, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
  327. Graphics graph_2 = Graphics.FromImage(image);
  328. for (int a = 0; a < fieldlist.Count; a++)
  329. {
  330. if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
  331. {
  332. //先获取该Field中的所有Particle
  333. List<Particle> list_particle;
  334. list_particle = fieldlist[a].ParticleList;
  335. //再循环计算所有的Particle对象
  336. foreach (Particle particle in list_particle)
  337. {
  338. List<Segment> list_seg;
  339. list_seg = particle.SegmentList;
  340. //创建颗粒分布图对应的类对象
  341. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  342. //再循环取出里面所有的segment
  343. foreach (Segment seg in list_seg)
  344. {
  345. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  346. Point on_p = new Point() { X = seg.Start, Y = seg.Height };
  347. Point off_p = new Point() { X = seg.Start + seg.Length, Y = seg.Height };
  348. //var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage("#434343", particle.TypeId);
  349. Pen npen = new Pen(Color.FromArgb(255-particle.AveGray, 0, 0, 0));
  350. graph_2.DrawLine(npen, on_p, off_p);
  351. #endregion
  352. }
  353. }
  354. }
  355. }
  356. data.Rows[c]["mat"] = image;
  357. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  358. }
  359. }
  360. }
  361. }
  362. DataView dataView1 = data.DefaultView;
  363. dataView1.Sort = "X ASC";
  364. data = dataView1.ToTable();
  365. list_dt_picdata.Add(data);
  366. }
  367. return list_dt_picdata;
  368. }
  369. private List<DataTable> opencv_piclist_Render()
  370. {
  371. List<DataTable> list_dt_picdata = new List<DataTable>();
  372. DataTable picDatat = new DataTable();
  373. List<Field> fieldlist = resultFile.List_OTSField;
  374. picDatat.Columns.Add("X", typeof(double));
  375. picDatat.Columns.Add("Y", typeof(double));
  376. foreach (var f in m_list_allDfield)
  377. {
  378. DataRow dr = picDatat.NewRow();
  379. dr["X"] = f.OTSCoordinatePos.X;
  380. dr["Y"] = f.OTSCoordinatePos.Y;
  381. picDatat.Rows.Add(dr);
  382. }
  383. DataTable total_dt_X = picDatat.Copy();
  384. DataView dv_x = total_dt_X.DefaultView;
  385. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  386. dv_x_2.Sort = "X ASC";
  387. total_dt_X = dv_x_2.ToTable();
  388. DataTable total_dt_Y = picDatat.Copy();
  389. DataView dv_Y = total_dt_Y.DefaultView;
  390. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  391. dv_Y_2.Sort = "Y ASC";
  392. total_dt_Y = dv_Y_2.ToTable();
  393. //循环每一行图片
  394. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  395. {
  396. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  397. DataTable data = new DataTable();
  398. data.Columns.Add("mat", typeof(Bitmap));
  399. data.Columns.Add("X", typeof(double));
  400. //循环每行图片进行拼接
  401. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  402. {
  403. DataRow dr2 = data.NewRow();
  404. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  405. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  406. Graphics g = Graphics.FromImage(bitmap);
  407. g.Clear(Color.White);
  408. g.Dispose();
  409. dr2["mat"] = bitmap;
  410. dr2["X"] = total_dt_X.Rows[a]["X"];
  411. data.Rows.Add(dr2);
  412. }
  413. //循环所有图片
  414. foreach (var f in m_list_allDfield)
  415. {
  416. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  417. {
  418. //循环图片的行数
  419. for (int c = 0; c < data.Rows.Count; c++)
  420. {
  421. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  422. {
  423. Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
  424. Graphics g2 = Graphics.FromImage(image);
  425. g2.DrawImage(f.OriginalImage, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
  426. Graphics graph_2 = Graphics.FromImage(image);
  427. for (int a = 0; a < fieldlist.Count; a++)
  428. {
  429. if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
  430. {
  431. //先获取该Field中的所有Particle
  432. List<Particle> list_particle;
  433. list_particle = fieldlist[a].ParticleList;
  434. //再循环计算所有的Particle对象
  435. foreach (Particle particle in list_particle)
  436. {
  437. List<Segment> list_seg;
  438. list_seg = particle.SegmentList;
  439. //创建颗粒分布图对应的类对象
  440. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  441. //再循环取出里面所有的segment
  442. foreach (Segment seg in list_seg)
  443. {
  444. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  445. Point on_p = new Point() { X = seg.Start, Y = seg.Height };
  446. Point off_p = new Point() { X = seg.Start + seg.Length, Y = seg.Height };
  447. var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
  448. Pen npen = new Pen(color);
  449. graph_2.DrawLine(npen, on_p, off_p);
  450. #endregion
  451. }
  452. }
  453. }
  454. }
  455. data.Rows[c]["mat"] = image;
  456. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  457. }
  458. }
  459. }
  460. }
  461. DataView dataView1 = data.DefaultView;
  462. dataView1.Sort = "X ASC";
  463. data = dataView1.ToTable();
  464. list_dt_picdata.Add(data);
  465. }
  466. return list_dt_picdata;
  467. }
  468. #region 合并天宇颗粒融合新增函数
  469. public void opencv_outpic2(/*int type*/)
  470. {
  471. List<DataTable> list_dt_picdata = new List<DataTable>();
  472. if (type == (int)Outpic_enum.pic || type == (int)Outpic_enum.Combin)
  473. {
  474. list_dt_picdata = opencv_piclist2();
  475. }
  476. else if (type == (int)Outpic_enum.Render_pic || type == (int)Outpic_enum.Render_Combin)
  477. {
  478. list_dt_picdata = opencv_piclist_Render2();
  479. }
  480. OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
  481. OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
  482. if (type == (int)Outpic_enum.Combin || type == (int)Outpic_enum.Render_Combin)
  483. {
  484. CImageHandler cImageHandler = new CImageHandler();
  485. Dictionary<string, object> sampleMembers = ((Dictionary<string, object>)((Dictionary<string, object>)resultFile.ResultInfo["Sample"])["Members"]);
  486. Dictionary<string, object> imageProcessParam = (Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)sampleMembers["MsrParams"])["Members"])["ImageProcessParam"];
  487. object strOverlapParam = "";
  488. imageProcessParam.TryGetValue("OverlapParam", out strOverlapParam);
  489. if (strOverlapParam == null)
  490. {
  491. NLog.LogManager.GetCurrentClassLogger().Info("There are no overlapping dimensions");
  492. return;
  493. }
  494. int OverlapParam = int.Parse(strOverlapParam.ToString());
  495. List<OpenCvSharp.Mat> maxXList = new List<OpenCvSharp.Mat>();
  496. for (int i = 0; i < list_dt_picdata.Count; i++)
  497. {
  498. OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count];
  499. for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++)
  500. {
  501. mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
  502. }
  503. //横向拼接
  504. maxXList.Add(cImageHandler.CombinImageX(mats, OverlapParam, type));
  505. }
  506. save_pano = cImageHandler.CombinImageY(maxXList.ToArray(), OverlapParam, type);
  507. OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
  508. NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
  509. }
  510. else
  511. {
  512. NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
  513. for (int i = 0; i < list_dt_picdata.Count; i++)
  514. {
  515. OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count];
  516. for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++)
  517. {
  518. mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
  519. }
  520. OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
  521. OpenCvSharp.Cv2.HConcat(mats, pano);
  522. list_mats[i] = pano;
  523. }
  524. NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed.");
  525. NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......");
  526. OpenCvSharp.Cv2.VConcat(list_mats, save_pano);
  527. OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
  528. NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
  529. }
  530. }
  531. private List<DataTable> opencv_piclist_Render2()
  532. {
  533. List<DataTable> list_dt_picdata = new List<DataTable>();
  534. DataTable picDatat = new DataTable();
  535. List<Field> fieldlist = resultFile.List_OTSField;
  536. picDatat.Columns.Add("X", typeof(double));
  537. picDatat.Columns.Add("Y", typeof(double));
  538. foreach (var f in m_list_allDfield)
  539. {
  540. DataRow dr = picDatat.NewRow();
  541. dr["X"] = f.GetShowRect().X;
  542. dr["Y"] = f.GetShowRect().Y;
  543. picDatat.Rows.Add(dr);
  544. }
  545. int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
  546. int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
  547. DataTable total_dt_X = picDatat.Copy();
  548. DataView dv_x = total_dt_X.DefaultView;
  549. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  550. dv_x_2.Sort = "X ASC";
  551. total_dt_X = dv_x_2.ToTable();
  552. DataTable total_dt_Y = picDatat.Copy();
  553. DataView dv_Y = total_dt_Y.DefaultView;
  554. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  555. dv_Y_2.Sort = "Y ASC";
  556. total_dt_Y = dv_Y_2.ToTable();
  557. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  558. {
  559. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  560. DataTable data = new DataTable();
  561. data.Columns.Add("mat", typeof(Bitmap));
  562. data.Columns.Add("X", typeof(double));
  563. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  564. {
  565. DataRow dr2 = data.NewRow();
  566. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  567. Graphics g = Graphics.FromImage(bitmap);
  568. g.Clear(Color.White);
  569. g.Dispose();
  570. dr2["mat"] = bitmap;
  571. dr2["X"] = total_dt_X.Rows[a]["X"];
  572. data.Rows.Add(dr2);
  573. }
  574. foreach (var f in m_list_allDfield)
  575. {
  576. if (total_dt_Y.Rows[i]["Y"].ToString() == f.GetShowRect().Y.ToString())
  577. {
  578. for (int c = 0; c < data.Rows.Count; c++)
  579. {
  580. if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString())
  581. {
  582. Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
  583. Graphics g2 = Graphics.FromImage(image);
  584. g2.DrawImage(f.OriginalImage, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
  585. Graphics graph_2 = Graphics.FromImage(image);
  586. for (int a = 0; a < fieldlist.Count; a++)
  587. {
  588. if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
  589. {
  590. //先获取该Field中的所有Particle
  591. List<Particle> list_particle;
  592. list_particle = fieldlist[a].ParticleList;
  593. //再循环计算所有的Particle对象
  594. foreach (Particle particle in list_particle)
  595. {
  596. //创建DParticle颗粒
  597. DisplayParticle dp = new DisplayParticle(particle);
  598. List<Segment> list_seg;
  599. list_seg = particle.SegmentList;
  600. //创建颗粒分布图对应的类对象
  601. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  602. //再循环取出里面所有的segment
  603. foreach (Segment seg in list_seg)
  604. {
  605. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  606. Point on_p = new Point() { X = seg.Start, Y = seg.Height };
  607. Point off_p = new Point() { X = seg.Start + seg.Length, Y = seg.Height };
  608. Pen npen = new Pen(dp.Color);
  609. graph_2.DrawLine(npen, on_p, off_p);
  610. #endregion
  611. }
  612. }
  613. }
  614. }
  615. data.Rows[c]["mat"] = image;
  616. data.Rows[c]["X"] = f.GetShowRect().X;
  617. }
  618. }
  619. }
  620. }
  621. DataView dataView1 = data.DefaultView;
  622. dataView1.Sort = "X ASC";
  623. data = dataView1.ToTable();
  624. list_dt_picdata.Add(data);
  625. }
  626. return list_dt_picdata;
  627. }
  628. /// <summary>
  629. /// 获取每行图片的位置配合opencv方法使用
  630. /// </summary>
  631. /// <returns></returns>
  632. private List<DataTable> opencv_piclist2()
  633. {
  634. List<DataTable> list_dt_picdata = new List<DataTable>();
  635. DataTable picDatat = new DataTable();
  636. picDatat.Columns.Add("X", typeof(double));
  637. picDatat.Columns.Add("Y", typeof(double));
  638. foreach (var f in m_list_allDfield)
  639. {
  640. DataRow dr = picDatat.NewRow();
  641. dr["X"] = f.GetShowRect().X;
  642. dr["Y"] = f.GetShowRect().Y;
  643. picDatat.Rows.Add(dr);
  644. }
  645. int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
  646. int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
  647. DataTable total_dt_X = picDatat.Copy();
  648. DataView dv_x = total_dt_X.DefaultView;
  649. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  650. dv_x_2.Sort = "X ASC";
  651. total_dt_X = dv_x_2.ToTable();
  652. DataTable total_dt_Y = picDatat.Copy();
  653. DataView dv_Y = total_dt_Y.DefaultView;
  654. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  655. dv_Y_2.Sort = "Y ASC";
  656. total_dt_Y = dv_Y_2.ToTable();
  657. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  658. {
  659. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  660. DataTable data = new DataTable();
  661. data.Columns.Add("mat", typeof(Bitmap));
  662. data.Columns.Add("X", typeof(double));
  663. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  664. {
  665. DataRow dr2 = data.NewRow();
  666. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  667. Graphics g = Graphics.FromImage(bitmap);
  668. g.Clear(Color.White);
  669. g.Dispose();
  670. dr2["mat"] = bitmap;
  671. dr2["X"] = total_dt_X.Rows[a]["X"];
  672. data.Rows.Add(dr2);
  673. }
  674. foreach (var f in m_list_allDfield)
  675. {
  676. if (total_dt_Y.Rows[i]["Y"].ToString() == f.GetShowRect().Y.ToString())
  677. {
  678. for (int c = 0; c < data.Rows.Count; c++)
  679. {
  680. if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString())
  681. {
  682. data.Rows[c]["mat"] = f.OriginalImage;
  683. data.Rows[c]["X"] = f.GetShowRect().X;
  684. }
  685. }
  686. }
  687. }
  688. DataView dataView1 = data.DefaultView;
  689. dataView1.Sort = "X ASC";
  690. data = dataView1.ToTable();
  691. list_dt_picdata.Add(data);
  692. }
  693. return list_dt_picdata;
  694. }
  695. #endregion
  696. public delegate void MyEntrust();
  697. public event MyEntrust MyEvent;
  698. }
  699. }