OutPIC.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. MessageBox.Show("Export completed!");
  186. }
  187. private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
  188. {
  189. int Long = 1;
  190. int Gitter_X = 10;
  191. for (int i = 0; i < particleData.Rows.Count; i++)
  192. {
  193. if (Gitter_X + 350 > list_pano[0].Width)
  194. {
  195. Long = Long + 1;
  196. Gitter_X = 10;
  197. }
  198. Gitter_X = Gitter_X + 350;
  199. }
  200. return Long;
  201. }
  202. private void picKopfzeile(Pen mypen, Font myFont, SolidBrush sbrush, Graphics g ,int X,int Y)
  203. {
  204. int Color_Y = Y; int TypeName_Y = Y+30; int Prozentsatz_Y = Y + 90; int Area_Y = Y+ 60;
  205. int Gitter_X = X;
  206. g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
  207. g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
  208. g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
  209. g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
  210. g.DrawString("Color", myFont, sbrush, Gitter_X + 1, Color_Y + 2);
  211. g.DrawString("TypeName", myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
  212. g.DrawString("Area", myFont, sbrush, Gitter_X + 1, Area_Y + 2);
  213. g.DrawString("Prozentsatz", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
  214. }
  215. private DataTable ParticleDataIntegration(DataTable ParticleAll,DataTable ParticleClass)
  216. {
  217. DataTable dt = ParticleClass.Copy();
  218. dt.Columns.Add("Area", typeof(float));
  219. dt.Columns.Add("Percentage");
  220. dt.Columns.Add("Color");
  221. double ParticleAreaTotal = 0;
  222. for (int i=0;i< ParticleAll.Rows.Count;i++)
  223. {
  224. ParticleAreaTotal = ParticleAreaTotal + Convert.ToDouble(ParticleAll.Rows[i]["Area"]);
  225. }
  226. for (int i=0;i< dt.Rows.Count;i++)
  227. {
  228. double ParticleArea = 0;
  229. string ParticleColer = "";
  230. for (int a=0;a< ParticleAll.Rows.Count;a++)
  231. {
  232. if (dt.Rows[i]["TypeName"].ToString()== ParticleAll.Rows[a]["TypeName"].ToString())
  233. {
  234. ParticleArea = ParticleArea + Convert.ToDouble(ParticleAll.Rows[a]["Area"]);
  235. ParticleColer = ParticleAll.Rows[a]["TypeColor"].ToString();
  236. }
  237. }
  238. dt.Rows[i]["Area"] = ParticleArea;
  239. dt.Rows[i]["Percentage"] = ParameterNormalization(ParticleAreaTotal, ParticleArea);
  240. dt.Rows[i]["Color"] = ParticleColer;
  241. }
  242. return dt;
  243. }
  244. /// <summary>
  245. /// 参数归一化
  246. /// </summary>
  247. /// <param name="a_mi">总数</param>
  248. /// <param name="m">传参</param>
  249. /// <returns></returns>
  250. private string ParameterNormalization(double a_mi, double m)
  251. {
  252. double ColVal = Convert.ToDouble(m / a_mi * 100);
  253. if (ColVal == 0)
  254. {
  255. return "";
  256. }
  257. else
  258. {
  259. return Math.Round(ColVal, 2).ToString();
  260. }
  261. }
  262. private List<DataTable> opencv_piclist_Render()
  263. {
  264. List<DataTable> list_dt_picdata = new List<DataTable>();
  265. DataTable picDatat = new DataTable();
  266. List<Field> fieldlist = resultFile.List_OTSField;
  267. picDatat.Columns.Add("X", typeof(double));
  268. picDatat.Columns.Add("Y", typeof(double));
  269. foreach (var f in m_list_allDfield)
  270. {
  271. DataRow dr = picDatat.NewRow();
  272. dr["X"] = f.OTSCoordinatePos.X;
  273. dr["Y"] = f.OTSCoordinatePos.Y;
  274. picDatat.Rows.Add(dr);
  275. }
  276. DataTable total_dt_X = picDatat.Copy();
  277. DataView dv_x = total_dt_X.DefaultView;
  278. DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
  279. dv_x_2.Sort = "X ASC";
  280. total_dt_X = dv_x_2.ToTable();
  281. DataTable total_dt_Y = picDatat.Copy();
  282. DataView dv_Y = total_dt_Y.DefaultView;
  283. DataView dv_Y_2 = dv_Y.ToTable(true, "Y").DefaultView;
  284. dv_Y_2.Sort = "Y ASC";
  285. total_dt_Y = dv_Y_2.ToTable();
  286. //循环每一行图片
  287. for (int i = 0; i < total_dt_Y.Rows.Count; i++)
  288. {
  289. NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
  290. DataTable data = new DataTable();
  291. data.Columns.Add("mat", typeof(Bitmap));
  292. data.Columns.Add("X", typeof(double));
  293. //循环每行图片进行拼接
  294. for (int a = 0; a < total_dt_X.Rows.Count; a++)
  295. {
  296. DataRow dr2 = data.NewRow();
  297. Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
  298. //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
  299. Graphics g = Graphics.FromImage(bitmap);
  300. g.Clear(Color.White);
  301. g.Dispose();
  302. dr2["mat"] = bitmap;
  303. dr2["X"] = total_dt_X.Rows[a]["X"];
  304. data.Rows.Add(dr2);
  305. }
  306. //循环所有图片
  307. foreach (var f in m_list_allDfield)
  308. {
  309. if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
  310. {
  311. //循环图片的行数
  312. for (int c = 0; c < data.Rows.Count; c++)
  313. {
  314. if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
  315. {
  316. Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
  317. Graphics g2 = Graphics.FromImage(image);
  318. g2.DrawImage(f.OriginalImage, 0, 0, f.OriginalImage.Width, f.OriginalImage.Height);
  319. Graphics graph_2 = Graphics.FromImage(image);
  320. for (int a = 0; a < fieldlist.Count; a++)
  321. {
  322. if (fieldlist[a].FieldID.ToString() == f.FieldID.ToString())
  323. {
  324. //先获取该Field中的所有Particle
  325. List<Particle> list_particle;
  326. list_particle = fieldlist[a].ParticleList;
  327. //再循环计算所有的Particle对象
  328. foreach (Particle particle in list_particle)
  329. {
  330. List<Segment> list_seg;
  331. list_seg = particle.SegmentList;
  332. //创建颗粒分布图对应的类对象
  333. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  334. //再循环取出里面所有的segment
  335. foreach (Segment seg in list_seg)
  336. {
  337. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  338. Point on_p = new Point() { X = seg.Start, Y = seg.Height };
  339. Point off_p = new Point() { X = seg.Start + seg.Length, Y = seg.Height };
  340. var color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
  341. Pen npen = new Pen(color);
  342. graph_2.DrawLine(npen, on_p, off_p);
  343. #endregion
  344. }
  345. }
  346. }
  347. }
  348. data.Rows[c]["mat"] = image;
  349. data.Rows[c]["X"] = f.OTSCoordinatePos.X;
  350. }
  351. }
  352. }
  353. }
  354. DataView dataView1 = data.DefaultView;
  355. dataView1.Sort = "X ASC";
  356. data = dataView1.ToTable();
  357. list_dt_picdata.Add(data);
  358. }
  359. return list_dt_picdata;
  360. }
  361. }
  362. }