OutPIC.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. using OTSCommon.Model;
  2. using OTSIncAReportGraph;
  3. using OTSIncAReportGraph.Class;
  4. using OTSIncAReportGraph.Controls;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace OTSIncAReportApp._3_ServiceCenter
  14. {
  15. class OutPIC
  16. {
  17. //包含particle的field的列表对象
  18. public List<DisplayField> m_list_allDfield = null;
  19. public ResultFile resultFile = null;
  20. public SaveFileDialog sfd = null;
  21. public DataTable ParticleData = new DataTable();
  22. public DataTable ParticleClassData = new DataTable();
  23. public int type = 0;
  24. /// <summary>
  25. /// 获取每行图片的位置配合opencv方法使用
  26. /// </summary>
  27. /// <returns></returns>
  28. private List<DataTable> opencv_piclist()
  29. {
  30. List<DataTable> list_dt_picdata = new List<DataTable>();
  31. DataTable picDatat = new DataTable();
  32. picDatat.Columns.Add("X", typeof(double));
  33. picDatat.Columns.Add("Y", typeof(double));
  34. foreach (var f in m_list_allDfield)
  35. {
  36. DataRow dr = picDatat.NewRow();
  37. dr["X"] = f.OTSCoordinatePos.X;
  38. dr["Y"] = f.OTSCoordinatePos.Y;
  39. //dr["X"] = f.GetShowRect().X;
  40. //dr["Y"] = f.GetShowRect().Y;
  41. picDatat.Rows.Add(dr);
  42. }
  43. //int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
  44. //int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
  45. DataTable total_dt_X = picDatat.Copy();
  46. DataView dv_x = total_dt_X.DefaultView;
  47. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  48. dv_x_2.Sort = "X ASC";
  49. total_dt_X = dv_x_2.ToTable();
  50. DataTable total_dt_Y = picDatat.Copy();
  51. DataView dv_Y = total_dt_Y.DefaultView;
  52. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  53. dv_Y_2.Sort = "Y ASC";
  54. total_dt_Y = dv_Y_2.ToTable();
  55. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  56. {
  57. NLog.LogManager.GetCurrentClassLogger().Info("Splice line"+i+1.ToString()+"of"+ total_dt_Y.Rows.Count.ToString()+".....");
  58. DataTable data = new DataTable();
  59. data.Columns.Add("mat", typeof(Bitmap));
  60. data.Columns.Add("X", typeof(double));
  61. data.Columns.Add("Y", typeof(double));
  62. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  63. {
  64. DataRow dr2 = data.NewRow();
  65. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  66. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  67. Graphics g = Graphics.FromImage(bitmap);
  68. g.Clear(Color.White);
  69. g.Dispose();
  70. dr2["mat"] = bitmap;
  71. dr2["X"] = total_dt_X.Rows[a]["X"];
  72. //dr2["Y"] = total_dt_X.Rows[a]["Y"];
  73. data.Rows.Add(dr2);
  74. }
  75. foreach (var f in m_list_allDfield)
  76. {
  77. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  78. {
  79. for (int c = 0; c < data.Rows.Count; c++)
  80. {
  81. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  82. {
  83. data.Rows[c]["mat"] = f.OriginalImage;
  84. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  85. data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
  86. }
  87. }
  88. }
  89. }
  90. DataView dataView1 = data.DefaultView;
  91. dataView1.Sort = "X ASC";
  92. data = dataView1.ToTable();
  93. list_dt_picdata.Add(data);
  94. }
  95. return list_dt_picdata;
  96. }
  97. public void opencv_outpic()
  98. {
  99. List<DataTable> list_dt_picdata = new List<DataTable>();
  100. OpenCvSharp.Mat[] list_mats;
  101. if (type == (int)Outpic_enum.pic)
  102. {
  103. list_dt_picdata = opencv_piclist();
  104. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
  105. }
  106. else
  107. //if (type == (int)Outpic_enum.Render_pic)
  108. {
  109. list_dt_picdata = opencv_piclist_Render();
  110. list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count + 1];
  111. }
  112. //OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
  113. NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
  114. List<OpenCvSharp.Mat> list_pano = new List<OpenCvSharp.Mat>();
  115. //循环保存每行拼接的图片
  116. for (int i = list_dt_picdata.Count-1; i >= 0; i--)
  117. {
  118. //拼接同一行中的图片
  119. OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count];
  120. for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++)
  121. {
  122. mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
  123. }
  124. OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
  125. OpenCvSharp.Cv2.HConcat(mats, pano);
  126. list_pano.Add(pano);
  127. //list_mats[i] = pano;
  128. }
  129. //导出原图(渲染图)在下方增加每种颜色的标注和面积占比
  130. if (type == (int)Outpic_enum.Render_pic)
  131. {
  132. DataTable particleData = ParticleDataIntegration(ParticleData, ParticleClassData);
  133. int NumberOfRows = getPICstringLong(particleData, list_pano);
  134. Bitmap bitmap = new Bitmap(list_pano[0].Width, NumberOfRows*140);
  135. Graphics g = Graphics.FromImage(bitmap);
  136. g.Clear(Color.White);
  137. int rowData = 10;
  138. //矩形格子宽500
  139. SolidBrush mysbrush1 = new SolidBrush(ColorTranslator.FromHtml("#000000"));
  140. Pen mypen = new Pen(mysbrush1, 2);
  141. Font myFont = new Font("宋体", 13, FontStyle.Bold);
  142. SolidBrush sbrush = new SolidBrush(Color.Black);
  143. int Color_Y = 10; int TypeName_Y = 40; int Prozentsatz_Y = 100;int Area_Y = 70;
  144. int Gitter_X = 10;
  145. picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
  146. Gitter_X = Gitter_X + 350;
  147. for (int i = 0; i < particleData.Rows.Count; i++)
  148. {
  149. if (Gitter_X+350> list_pano[0].Width)
  150. {
  151. rowData = rowData + 130;
  152. picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
  153. Color_Y = Color_Y + 130;
  154. TypeName_Y = TypeName_Y + 130;
  155. Prozentsatz_Y = Prozentsatz_Y + 130;
  156. Area_Y = Area_Y + 130;
  157. Gitter_X = 360;
  158. }
  159. g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
  160. g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
  161. g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
  162. g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
  163. SolidBrush mysbrush = new SolidBrush(ColorTranslator.FromHtml(particleData.Rows[i]["Color"].ToString()));
  164. g.FillRectangle(mysbrush, Gitter_X + 1, Color_Y + 1, 348, 28);
  165. g.DrawString(particleData.Rows[i]["TypeName"].ToString(), myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
  166. g.DrawString(particleData.Rows[i]["Area"].ToString(), myFont, sbrush, Gitter_X + 1, Area_Y + 2);
  167. g.DrawString(particleData.Rows[i]["Percentage"].ToString()+"%", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
  168. Gitter_X = Gitter_X + 350;
  169. }
  170. g.Dispose();
  171. //bitmap.Save("D:\\1.bmp");
  172. OpenCvSharp.Mat pano = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
  173. list_pano.Add(pano);
  174. }
  175. for (int i = 0; i < list_pano.Count; i++)
  176. {
  177. list_mats[i] = list_pano[i];
  178. }
  179. NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed.");
  180. NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......");
  181. OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
  182. OpenCvSharp.Cv2.VConcat(list_mats, save_pano);
  183. OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
  184. NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
  185. }
  186. private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
  187. {
  188. int Long = 1;
  189. int Gitter_X = 10;
  190. for (int i = 0; i < particleData.Rows.Count; i++)
  191. {
  192. if (Gitter_X + 350 > list_pano[0].Width)
  193. {
  194. Long = Long + 1;
  195. Gitter_X = 10;
  196. }
  197. Gitter_X = Gitter_X + 350;
  198. }
  199. return Long;
  200. }
  201. private void picKopfzeile(Pen mypen, Font myFont, SolidBrush sbrush, Graphics g ,int X,int Y)
  202. {
  203. int Color_Y = Y; int TypeName_Y = Y+30; int Prozentsatz_Y = Y + 90; int Area_Y = Y+ 60;
  204. int Gitter_X = X;
  205. g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
  206. g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
  207. g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
  208. g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
  209. g.DrawString("Color", myFont, sbrush, Gitter_X + 1, Color_Y + 2);
  210. g.DrawString("TypeName", myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
  211. g.DrawString("Area", myFont, sbrush, Gitter_X + 1, Area_Y + 2);
  212. g.DrawString("Prozentsatz", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
  213. }
  214. private DataTable ParticleDataIntegration(DataTable ParticleAll,DataTable ParticleClass)
  215. {
  216. DataTable dt = ParticleClass.Copy();
  217. dt.Columns.Add("Area", typeof(float));
  218. dt.Columns.Add("Percentage");
  219. dt.Columns.Add("Color");
  220. double ParticleAreaTotal = 0;
  221. for (int i=0;i< ParticleAll.Rows.Count;i++)
  222. {
  223. ParticleAreaTotal = ParticleAreaTotal + Convert.ToDouble(ParticleAll.Rows[i]["Area"]);
  224. }
  225. for (int i=0;i< dt.Rows.Count;i++)
  226. {
  227. double ParticleArea = 0;
  228. double ParticleColer = 0;
  229. for (int a=0;a< ParticleAll.Rows.Count;a++)
  230. {
  231. if (dt.Rows[i]["TypeName"].ToString()== ParticleAll.Rows[a]["TypeName"].ToString())
  232. {
  233. ParticleArea = ParticleArea + Convert.ToDouble(ParticleAll.Rows[a]["Area"]);
  234. ParticleColer = Convert.ToDouble(ParticleAll.Rows[a]["TypeColor"]);
  235. }
  236. }
  237. dt.Rows[i]["Area"] = ParticleArea;
  238. dt.Rows[i]["Percentage"] = ParameterNormalization(ParticleAreaTotal, ParticleArea);
  239. dt.Rows[i]["Color"] = ParticleColer;
  240. }
  241. return dt;
  242. }
  243. /// <summary>
  244. /// 参数归一化
  245. /// </summary>
  246. /// <param name="a_mi">总数</param>
  247. /// <param name="m">传参</param>
  248. /// <returns></returns>
  249. private string ParameterNormalization(double a_mi, double m)
  250. {
  251. double ColVal = Convert.ToDouble(m / a_mi * 100);
  252. if (ColVal == 0)
  253. {
  254. return "";
  255. }
  256. else
  257. {
  258. return Math.Round(ColVal, 2).ToString();
  259. }
  260. }
  261. private List<DataTable> opencv_piclist_Render()
  262. {
  263. List<DataTable> list_dt_picdata = new List<DataTable>();
  264. DataTable picDatat = new DataTable();
  265. List<Field> fieldlist = resultFile.List_OTSField;
  266. picDatat.Columns.Add("X", typeof(double));
  267. picDatat.Columns.Add("Y", typeof(double));
  268. foreach (var f in m_list_allDfield)
  269. {
  270. DataRow dr = picDatat.NewRow();
  271. dr["X"] = f.OTSCoordinatePos.X;
  272. dr["Y"] = f.OTSCoordinatePos.Y;
  273. picDatat.Rows.Add(dr);
  274. }
  275. DataTable total_dt_X = picDatat.Copy();
  276. DataView dv_x = total_dt_X.DefaultView;
  277. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  278. dv_x_2.Sort = "X ASC";
  279. total_dt_X = dv_x_2.ToTable();
  280. DataTable total_dt_Y = picDatat.Copy();
  281. DataView dv_Y = total_dt_Y.DefaultView;
  282. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  283. dv_Y_2.Sort = "Y ASC";
  284. total_dt_Y = dv_Y_2.ToTable();
  285. //循环每一行图片
  286. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  287. {
  288. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  289. DataTable data = new DataTable();
  290. data.Columns.Add("mat", typeof(Bitmap));
  291. data.Columns.Add("X", typeof(double));
  292. //循环每行图片进行拼接
  293. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  294. {
  295. DataRow dr2 = data.NewRow();
  296. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  297. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  298. Graphics g = Graphics.FromImage(bitmap);
  299. g.Clear(Color.White);
  300. g.Dispose();
  301. dr2["mat"] = bitmap;
  302. dr2["X"] = total_dt_X.Rows[a]["X"];
  303. data.Rows.Add(dr2);
  304. }
  305. //循环所有图片
  306. foreach (var f in m_list_allDfield)
  307. {
  308. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  309. {
  310. //循环图片的行数
  311. for (int c = 0; c < data.Rows.Count; c++)
  312. {
  313. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  314. {
  315. Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
  316. Graphics g2 = Graphics.FromImage(image);
  317. g2.DrawImage(f.OriginalImage, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
  318. Graphics graph_2 = Graphics.FromImage(image);
  319. for (int a = 0; a < fieldlist.Count; a++)
  320. {
  321. if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
  322. {
  323. //先获取该Field中的所有Particle
  324. List<Particle> list_particle;
  325. list_particle = fieldlist[a].ParticleList;
  326. //再循环计算所有的Particle对象
  327. foreach (Particle particle in list_particle)
  328. {
  329. List<Segment> list_seg;
  330. list_seg = particle.SegmentList;
  331. //创建颗粒分布图对应的类对象
  332. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  333. //再循环取出里面所有的segment
  334. foreach (Segment seg in list_seg)
  335. {
  336. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  337. Point on_p = new Point() { X = seg.Start, Y = seg.Height };
  338. Point off_p = new Point() { X = seg.Start + seg.Length, Y = seg.Height };
  339. var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
  340. Pen npen = new Pen(color);
  341. graph_2.DrawLine(npen, on_p, off_p);
  342. #endregion
  343. }
  344. }
  345. }
  346. }
  347. data.Rows[c]["mat"] = image;
  348. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  349. }
  350. }
  351. }
  352. }
  353. DataView dataView1 = data.DefaultView;
  354. dataView1.Sort = "X ASC";
  355. data = dataView1.ToTable();
  356. list_dt_picdata.Add(data);
  357. }
  358. return list_dt_picdata;
  359. }
  360. }
  361. }