OutPIC.cs 43 KB

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