OutPIC.cs 43 KB

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