OutPIC.cs 19 KB

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