MergedparticlesHelper.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Drawing;
  5. using System.Drawing.Imaging;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace OTSCommon
  11. {
  12. public class MergedparticlesHelper
  13. {
  14. private SqLiteHelper dbHelper;
  15. public MergedparticlesHelper(string path)
  16. {
  17. dbHelper = new SqLiteHelper("data source = '"+path+"'");
  18. }
  19. /// <summary>
  20. /// 获取ParticleList
  21. /// </summary>
  22. /// <param name="model">Feature</param>
  23. /// <returns></returns>
  24. public DataTable GetMergedParticles()
  25. {
  26. string sqlp = @"select *,
  27. (select group_concat(name||'-'||Percentage,';')
  28. from ElementChemistry where XRayId =MergedParticles.XRayId and fieldid=MergedParticles.fieldid ) as Element
  29. from MergedParticles ";
  30. DataTable DT = dbHelper.ExecuteQuery(sqlp);
  31. // List<Model.Particle> listp = dbHelper.TableToList<Model.Particle>(DT);
  32. return DT;
  33. }
  34. /// <summary>
  35. /// 获取所有Particle
  36. /// </summary>
  37. /// <returns></returns>
  38. public DataTable GetParticleAll(string fieldAndPartic)
  39. {
  40. string sqlp = @"select * from INcAData";
  41. if (fieldAndPartic != "")
  42. {
  43. sqlp = sqlp + " where '" + fieldAndPartic + "' like ('%,'||fieldid||'-'||particleid||',%')";
  44. }
  45. DataTable DT = dbHelper.ExecuteQuery(sqlp);
  46. return DT;
  47. }
  48. /// <summary>
  49. /// 通过FileStream 来打开文件,这样就可以实现不锁定Image文件,到时可以让多用户同时访问Image文件
  50. /// </summary>
  51. /// <param name="path"></param>
  52. /// <returns></returns>
  53. public Bitmap ReadImageFile(string path)
  54. {
  55. if (!File.Exists(path))
  56. {
  57. return null;//文件不存在
  58. }
  59. FileStream fs = File.OpenRead(path); //OpenRead
  60. int filelength = 0;
  61. filelength = (int)fs.Length; //获得文件长度
  62. Byte[] image = new Byte[filelength]; //建立一个字节数组
  63. fs.Read(image, 0, filelength); //按字节流读取
  64. System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
  65. fs.Close();
  66. Bitmap bit = new Bitmap(result);
  67. return bit;
  68. }
  69. public Bitmap GetBitmapForBig(string sub, double xs, string path)
  70. {
  71. string vs = "," + sub.Replace(':', '-') + ",";
  72. DataTable dataTable = GetParticleAll(vs);
  73. if (dataTable.Rows.Count == 0)
  74. {
  75. return null;
  76. }
  77. //内接矩形
  78. double max_Y = Convert.ToInt64(dataTable.Rows[0]["FieldPosY"]) * xs - Convert.ToInt64(dataTable.Rows[0]["RectTop"]);
  79. double max_X = Convert.ToInt64(dataTable.Rows[0]["FieldPosX"]) * xs + Convert.ToInt64(dataTable.Rows[0]["RectLeft"]);
  80. double min_Y = max_Y;
  81. double min_X = max_X;
  82. //拼接field矩形
  83. double MAX_Y = Convert.ToInt64(dataTable.Rows[0]["FieldPosY"]) * xs;
  84. double MAX_X = Convert.ToInt64(dataTable.Rows[0]["FieldPosX"]) * xs;
  85. double MIN_Y = MAX_Y;
  86. double MIN_X = MAX_X;
  87. foreach (DataRow item in dataTable.Rows)
  88. {
  89. //颗粒外接矩形
  90. double lefttopX = Convert.ToInt64(item["FieldPosX"]) * xs + Convert.ToInt64(item["RectLeft"]);
  91. if (lefttopX < min_X)
  92. {
  93. min_X = lefttopX;
  94. }
  95. if (lefttopX + Convert.ToInt64(item["RectWidth"]) > max_X)
  96. {
  97. max_X = lefttopX + Convert.ToInt64(item["RectWidth"]);
  98. }
  99. double lrfttopY = Convert.ToInt64(item["FieldPosY"]) * xs - Convert.ToInt64(item["RectTop"]);
  100. if (max_Y < lrfttopY)
  101. {
  102. max_Y = lrfttopY;
  103. }
  104. if (min_Y > lrfttopY - Convert.ToInt64(item["RectHeight"]))
  105. {
  106. min_Y = lrfttopY - Convert.ToInt64(item["RectHeight"]);
  107. }
  108. //画布
  109. double lefttopXH = Convert.ToInt64(item["FieldPosX"]) * xs;
  110. if (lefttopXH > MAX_X)
  111. {
  112. MAX_X = lefttopXH;
  113. }
  114. if (lefttopXH < MIN_X)
  115. {
  116. MIN_X = lefttopXH;
  117. }
  118. double lrfttopYH = Convert.ToInt64(item["FieldPosY"]) * xs;
  119. if (MAX_Y < lrfttopYH)
  120. {
  121. MAX_Y = lrfttopYH;
  122. }
  123. if (MIN_Y > lrfttopYH)
  124. {
  125. MIN_Y = lrfttopYH;
  126. }
  127. }
  128. int WIDTH = Convert.ToInt32(MAX_X - MIN_X) + 1024;
  129. int HEIGHT = Convert.ToInt32(MAX_Y - MIN_Y) + 768;
  130. //构造最终的图片白板
  131. Bitmap tableChartImage = new Bitmap(WIDTH, HEIGHT);
  132. Graphics graph = Graphics.FromImage(tableChartImage);
  133. //初始化这个大图
  134. graph.DrawImage(tableChartImage, 0, 0);
  135. int width = Convert.ToInt32(max_X - min_X);
  136. int height = Convert.ToInt32(max_Y - min_Y);
  137. int X = Convert.ToInt32(min_X - MIN_X);
  138. int Y = Convert.ToInt32(MAX_Y - max_Y);
  139. Rectangle rectangle = new Rectangle() { X = X, Y = Y, Width = width, Height = height };
  140. foreach (DataRow item in dataTable.Rows)
  141. {
  142. string filePath = path + "\\FIELD_FILES\\";
  143. string imagePath = filePath + "Field" + item["fieldid"].ToString() + ".bmp";
  144. //然后将取出的数据,转换成Bitmap对象
  145. Bitmap ls_bt = ReadImageFile(imagePath);
  146. int x = Convert.ToInt32(Convert.ToDouble(item["FieldPosX"]) * xs - MIN_X);
  147. int y = Convert.ToInt32(Convert.ToDouble(item["FieldPosY"]) * xs - MIN_Y);
  148. try
  149. {
  150. graph.DrawImage(ls_bt, x, y);
  151. }
  152. catch /*(Exception e)*/
  153. {
  154. throw;
  155. }
  156. }
  157. Bitmap bmap = tableChartImage.Clone(rectangle, PixelFormat.Format8bppIndexed);
  158. // bmap.Save(path + "asd.bmp");
  159. return bmap;
  160. }
  161. }
  162. }