OutPIC.cs 49 KB

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