URMProcess.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. using System.IO;
  2. using System.Runtime.InteropServices;
  3. using Vinno.DataManager.Process;
  4. using Vinno.DataTypes;
  5. using Vinno.Infrastructure;
  6. using Vinno.DataManager.GraphTransform;
  7. using Vinno.Enums;
  8. using Vinno.ProcessUnits.DisplayLib;
  9. using System.Collections.Generic;
  10. using Vinno.DataManager.Infrastructure;
  11. using System;
  12. using Vinno.DataManager.Utilities;
  13. using SkiaSharp;
  14. using System.Diagnostics;
  15. using WingServerCommon.Log;
  16. using Logger = WingServerCommon.Log.Logger;
  17. namespace WingAIDiagnosisService.URMManage
  18. {
  19. public class URMProcess
  20. {
  21. private URMProcessAlg _urmProcessAlg;
  22. private URMProcessParams _urmProcessParams = new URMProcessParams();
  23. private URMImgBaseParam _urmImgBaseParam = new URMImgBaseParam();
  24. private URMImgDrawParam _urmImgDrawParam = new URMImgDrawParam();
  25. private URMVideoParam _urmVideoParam = new URMVideoParam();
  26. public ProcessUnitParam<URMType> _urmType;
  27. public ImagePP ImagePP { get; private set; }
  28. private int Mixflag;
  29. private DPoint[] urmTraceDPoints;
  30. private byte[] imagePixels;
  31. private int ScreenWidth;
  32. private int ScreenHeight;
  33. private GCHandle handle;
  34. private ColorTable videoColorTable;
  35. public bool init(string familyName, string typeInfo, string nativeId)
  36. {
  37. var dir = new VinnoDirectoryInfo(Path.Combine(ServiceManager.RootPath, "URM"));
  38. NativeProxy.UpdateSection("Path", "ShippedRoot", dir.FullName);
  39. NativeProxy.UpdateSection("Product-GeneralSpecification", "ImagePPFileName", "ImagePP_Tulip");
  40. if (ServiceManager.Os.IsWin())
  41. {
  42. ImagePP = new ImagePPNative_Win();
  43. }
  44. else
  45. {
  46. ImagePP = new ImagePPNative();
  47. }
  48. ImagePP.Initial();
  49. Logger.WriteLineInfo($"Record.SetProbeApp({familyName},{typeInfo},{nativeId})");
  50. ImagePP.Initial(familyName, typeInfo, nativeId);
  51. // TODO Delete me
  52. var maplength = new List<int>();
  53. var result = ImagePP.GetParameter("SRColorMap:AngleMap", "SR_Map_Length", maplength, null);
  54. Logger.WriteLineInfo("ImagePP.GetParameter," + result);
  55. // TODO Delete me
  56. _urmProcessAlg = new URMProcessAlg(ImagePP);
  57. _urmType.Init(URMType.Den);
  58. urmTraceDPoints = new DPoint[0];
  59. return result;
  60. }
  61. // 调节后处理参数调用此函数
  62. public void setUrmParams(RecordParams paramName, object param)
  63. {
  64. switch (paramName)
  65. {
  66. case RecordParams.URMDownSampleIndex:
  67. _urmProcessParams.DownsampleIndex = (float)param;
  68. break;
  69. case RecordParams.URMIntPowerDen:
  70. _urmProcessParams.IntPowerDen = (float)param / 10.0;
  71. break;
  72. case RecordParams.URMIntPowerDir:
  73. _urmProcessParams.IntPowerDir = (float)param / 10.0;
  74. break;
  75. case RecordParams.URMSigmaGauss:
  76. _urmProcessParams.SigmaGauss = (float)param / 2.0;
  77. break;
  78. case RecordParams.URMVessScale:
  79. _urmProcessParams.VessScale = (float)param / 5.0;
  80. break;
  81. case RecordParams.URMVelMaxScaler:
  82. _urmProcessParams.VelMaxScaler = (float)param;
  83. break;
  84. case RecordParams.URMVelMinScaler:
  85. _urmProcessParams.VelMinScaler = (float)param;
  86. break;
  87. case RecordParams.URMIterations:
  88. _urmProcessParams.iterations = (int)(float)param;
  89. break;
  90. case RecordParams.URMSigmaDen:
  91. _urmProcessParams.URMSigmaDen = (float)param;
  92. break;
  93. case RecordParams.URMSigmaStep:
  94. _urmProcessParams.URMSigmaStep = (float)param;
  95. break;
  96. case RecordParams.URMDirIterGauss:
  97. _urmProcessParams.URMDirIterGauss = (int)(float)param;
  98. break;
  99. case RecordParams.URMVideoScaler:
  100. _urmVideoParam._VideoScaler = (float)param;
  101. break;
  102. case RecordParams.URMVideoParameter:
  103. _urmVideoParam._VideoDownSampleIndex = (float)param;
  104. break;
  105. case RecordParams.URMVideoType:
  106. _urmVideoParam._VideoType = (float)param;
  107. break;
  108. case RecordParams.UrmImageType:
  109. _urmType.SetCurrent((URMType)Enum.Parse(typeof(URMType), (string)param));
  110. break;
  111. case RecordParams.UrmBlend:
  112. Mixflag = (int)param;
  113. break;
  114. }
  115. }
  116. public void setUrmBaseParam(double res, NativeArray urmDenArray, NativeArray urmDirArray, NativeArray urmVelArray, NativeArray urmAngleArray, NativeArray urmMask, int urmSrcWidth, int urmSrcHeight, double scaleOfPixel_x, double scaleOfPixel_y, int ImgProcessVer)
  117. {
  118. _urmImgBaseParam.Res = res; // 参数
  119. _urmImgBaseParam.Denptr = urmDenArray.Start; // den 数组的指针
  120. _urmImgBaseParam.Dirptr = urmDirArray.Start; // dir 数组的指针
  121. _urmImgBaseParam.Velptr = urmVelArray.Start; // vel 数组的指针
  122. _urmImgBaseParam.Angleptr = urmAngleArray.Start; // angle 数组的指针
  123. _urmImgBaseParam.MaskPtr = urmMask.Start; // mask 数组的指针
  124. _urmImgBaseParam.Urmsrcwidth = urmSrcWidth; // 参数
  125. _urmImgBaseParam.Urmsrcheight = urmSrcHeight; // 参数
  126. _urmImgBaseParam.ScaleOfPixel_x = scaleOfPixel_x; // 参数
  127. _urmImgBaseParam.ScaleOfPixel_y = scaleOfPixel_y; // 参数
  128. _urmImgBaseParam.ImgProcessVer = ImgProcessVer; // urm算法版本 0 是 v2 1 是 v3
  129. _urmImgBaseParam.vespekeltype = ImagePP.GetValue("URMVSpeckel", "URMVSpeckelType", 1);
  130. _urmProcessAlg.SetURMBaseParam(_urmImgBaseParam);
  131. }
  132. public void setUrmDrawParam(
  133. bool ZoomOn, double ZoomRoix, double ZoomRoiy, double ZoomRoiwidth, double ZoomRoiheight, int Roix, int Roiy, int Roiwidth, int Roiheight, bool LeftRight, bool UpDown, int screenWidth, int screenHeight, bool setImagePixels = true)
  134. {
  135. // 初始化图像
  136. ScreenWidth = screenWidth;
  137. ScreenHeight = screenHeight;
  138. imagePixels = new byte[ScreenWidth * ScreenHeight * 4];
  139. for (int i = 0; i < ScreenWidth * ScreenHeight; i++)
  140. {
  141. int index = i * 4;
  142. imagePixels[index] = 0; // Blue
  143. imagePixels[index + 1] = 0; // Green
  144. imagePixels[index + 2] = 0; // Red
  145. imagePixels[index + 3] = 1; // Alpha
  146. }
  147. // 获取指针
  148. handle = GCHandle.Alloc(imagePixels, GCHandleType.Pinned);
  149. _urmImgDrawParam.Screenimgptr = handle.AddrOfPinnedObject(); // 图像指针(最重要,用于获取图像)
  150. _urmImgDrawParam.ZoomOn = ZoomOn ? 1 : 0; // 是否启用 zoom
  151. _urmImgDrawParam.ZoomRoix = ZoomRoix; // zoom 后 ROI X
  152. _urmImgDrawParam.ZoomRoiy = ZoomRoiy; // zoom 后 ROI X
  153. _urmImgDrawParam.ZoomRoiwidth = ZoomRoiwidth; // zoom 后 ROI 宽度
  154. _urmImgDrawParam.ZoomRoiheight = ZoomRoiheight; // zoom 后 ROI 宽度
  155. _urmImgDrawParam.Screenimgwidth = ScreenWidth; // 图像输出的宽度
  156. _urmImgDrawParam.Screenimgheight = ScreenHeight; // 图像输出的高度
  157. _urmImgDrawParam.Roix = Roix; // ROI x
  158. _urmImgDrawParam.Roiy = Roiy; // ROI y
  159. _urmImgDrawParam.Roiwidth = Roiwidth; // 宽度
  160. _urmImgDrawParam.Roiheight = Roiheight; // 高度
  161. _urmImgDrawParam.LeftRight = LeftRight ? 1 : 0; // 是否左右翻转
  162. _urmImgDrawParam.UpDown = UpDown ? 1 : 0; // 是否上下翻转
  163. _urmProcessAlg.SetURMDrawParam(_urmImgDrawParam);
  164. }
  165. // public WriteableBitmap getURMImage()
  166. // {
  167. // WriteableBitmap bitmap = new WriteableBitmap(ScreenWidth, ScreenHeight, 96, 96, PixelFormats.Bgra32, null);
  168. // _urmProcessAlg.SetURMParam(_urmProcessParams);
  169. // double urmMaxVal = 0; // 这个输出需要给到前端
  170. // double urmMinVal = 0; // 这个输出需要给到前端
  171. // _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  172. // Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal} {bitmap.PixelWidth}");
  173. // var urmcolormapname = getColormapname((int)_urmType.Current);
  174. // var urmcolortable = GetURMColorMap(urmcolormapname);
  175. // var Colormapptr = urmcolortable.Address; // 获取颜色映射表
  176. // if (_urmType == URMType.Angle && urmcolortable.Length != 1440)
  177. // {
  178. // Logger.WriteLineInfo("Akio:Angle ColorMapError");
  179. // return bitmap;
  180. // }
  181. // _urmProcessAlg.DrawURM((int)_urmType.Current, Colormapptr, Mixflag);
  182. // Int32Rect rect = new Int32Rect(0, 0, ScreenWidth, ScreenHeight);
  183. // bitmap.WritePixels(rect, imagePixels, ScreenWidth * 4, 0);
  184. // return bitmap;
  185. // }
  186. public void GetURMImage()
  187. {
  188. // SKBitmap bitmap = new SKBitmap(ScreenWidth, ScreenHeight);
  189. _urmProcessAlg.SetURMParam(_urmProcessParams);
  190. double urmMaxVal = 0;
  191. double urmMinVal = 0;
  192. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  193. Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  194. var urmcolormapname = getColormapname((int)_urmType.Current);
  195. var urmcolortable = GetURMColorMap(urmcolormapname);
  196. var Colormapptr = urmcolortable.Address;
  197. if (_urmType == URMType.Angle && urmcolortable.Length != 1440)
  198. {
  199. Logger.WriteLineInfo("Akio:Angle ColorMapError");
  200. // return bitmap;
  201. return;
  202. }
  203. _urmProcessAlg.DrawURM((int)_urmType.Current, Colormapptr, Mixflag);
  204. // using (var surface = SKSurface.Create(new SKImageInfo(ScreenWidth, ScreenHeight, SKColorType.Bgra8888)))
  205. // {
  206. // SKCanvas canvas = surface.Canvas;
  207. // // Draw your URM image on the canvas here
  208. // SKImage image = surface.Snapshot();
  209. // byte[] imageBytes = image.Encode().ToArray();
  210. // bitmap = SKBitmap.Decode(imageBytes);
  211. // }
  212. // return bitmap;
  213. }
  214. public void getUrmVal(ref double urmMaxVal, ref double urmMinVal)
  215. {
  216. _urmProcessAlg.SetURMParam(_urmProcessParams);
  217. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  218. Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  219. }
  220. public string getURMImageBase64(bool calUrmImg, ref double urmMinVal, ref double urmMaxVal)
  221. {
  222. _urmProcessAlg.SetURMParam(_urmProcessParams);
  223. urmMinVal = 0; // 这个输出需要给到前端
  224. urmMaxVal = 0; // 这个输出需要给到前端
  225. if (calUrmImg)
  226. {
  227. Stopwatch sw = new Stopwatch();
  228. sw.Start();
  229. try
  230. {
  231. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  232. }
  233. catch (Exception ex)
  234. {
  235. WingServerCommon.Log.Logger.WriteLineInfo($"_urmProcessAlg.CalURMImg error :{ex}");
  236. }
  237. sw.Stop();
  238. WingServerCommon.Log.Logger.WriteLineInfo($"_urmProcessAlg.CalURMImg time :{sw.ElapsedMilliseconds}");
  239. }
  240. WingServerCommon.Log.Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  241. var urmcolormapname = getColormapname((int)_urmType.Current);
  242. var urmcolortable = GetURMColorMap(urmcolormapname);
  243. var Colormapptr = urmcolortable.Address; // 获取颜色映射表
  244. if (_urmType == URMType.Angle && urmcolortable.Length != 1440)
  245. {
  246. Logger.WriteLineInfo("Akio:Angle ColorMapError");
  247. return "";
  248. }
  249. int mix = 0;
  250. mix = Mixflag;
  251. if (Mixflag == 1)
  252. {
  253. mix = 0;
  254. }
  255. _urmProcessAlg.DrawURM((int)_urmType.Current, Colormapptr, mix);
  256. //using (SKImage image = SKImage.FromEncodedData(SKData.CreateCopy(imagePixels)))
  257. //{
  258. // SKBitmap bitMap = SKBitmap.FromImage(image);
  259. //}
  260. SKImageInfo info = new SKImageInfo(ScreenWidth, ScreenHeight, SKColorType.Bgra8888, SKAlphaType.Unpremul);
  261. // Create an SKBitmap with the given SKImageInfo
  262. SKBitmap skBitmap = new SKBitmap(info);
  263. // Copy the pixel data from the imagePixels array to the SKBitmap
  264. using (SKImage skImage = SKImage.FromPixelCopy(info, imagePixels))
  265. {
  266. skImage?.ReadPixels(skBitmap.Info, skBitmap.GetPixels(), skBitmap.RowBytes, 0, 0);
  267. if (Mixflag == 1)
  268. {
  269. for (int y = 0; y < skBitmap.Height; y++)
  270. {
  271. for (int x = 0; x < skBitmap.Width; x++)
  272. {
  273. SKColor pixelColor = skBitmap.GetPixel(x, y);
  274. if (pixelColor.Alpha == 255 && pixelColor.Red == 0 && pixelColor.Green == 0 && pixelColor.Blue == 0)
  275. {
  276. SKColor modifiedColor = new SKColor(0, 0, 0, 128); // 将全黑像素设置为50%透明
  277. skBitmap.SetPixel(x, y, modifiedColor);
  278. }
  279. }
  280. }
  281. }
  282. }
  283. using (var image = SKImage.FromBitmap(skBitmap))
  284. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  285. {
  286. byte[] imageBytes = data.ToArray();
  287. string base64String = Convert.ToBase64String(imageBytes);
  288. return base64String;
  289. }
  290. }
  291. string getColormapname(int type)
  292. {
  293. switch (type)
  294. {
  295. case 0:
  296. return "SRColorMap:ColorMap1";
  297. case 1:
  298. return "SRColorMap:ColorMap2";
  299. case 2:
  300. return "SRColorMap:ColorMap3";
  301. case 3:
  302. return "SRColorMap:AngleMap";
  303. default:
  304. return "SRColorMap:ColorMap1";
  305. }
  306. }
  307. public ColorTable GetURMColorMap(string colorMap)
  308. {
  309. var rValue = new List<int>();
  310. var gValue = new List<int>();
  311. var bValue = new List<int>();
  312. var maplength = new List<int>();
  313. var result = ImagePP.GetParameter(colorMap, "SR_Map_R", rValue, null);
  314. result = result && ImagePP.GetParameter(colorMap, "SR_Map_G", gValue, null);
  315. result = result && ImagePP.GetParameter(colorMap, "SR_Map_B", bValue, null);
  316. result = result && ImagePP.GetParameter(colorMap, "SR_Map_Length", maplength, null);
  317. ColorTable URMTable = new ColorTable(maplength[0] * sizeof(uint));
  318. if (result)
  319. {
  320. IValueAccessor<uint> intValueAccessor = URMTable;
  321. for (int i = 0; i < maplength[0]; i++)
  322. {
  323. var temp = rValue[i] << 16 | gValue[i] << 8 | bValue[i] | 0xFF000000;
  324. intValueAccessor[i] = (uint)temp;
  325. }
  326. }
  327. return URMTable;
  328. }
  329. public void CalTracePointMask(DPoint[] traceDPoints)
  330. {
  331. urmTraceDPoints = traceDPoints;
  332. var tracePointCount = urmTraceDPoints.Length;
  333. var validPoints = new List<DPoint>();
  334. for (int i = 0; i < tracePointCount; i++)
  335. {
  336. var curPiexlPoint = new DPoint(urmTraceDPoints[i].X * ScreenWidth, urmTraceDPoints[i].Y * ScreenHeight);
  337. validPoints.Add(curPiexlPoint);
  338. }
  339. _urmProcessAlg.CalTraceMaskImg(ScreenWidth, ScreenHeight, validPoints);
  340. }
  341. public void PreURMVideo(URMPoint[] urmPoints, int[] Pointsnums, ref double urmMaxVal, ref double urmMinVal)
  342. {
  343. var vediotable = GetURMColorMap("SRColorMap:ColorMap4");
  344. urmMaxVal = 0;
  345. urmMinVal = 0;
  346. _urmProcessAlg.SetURMParam(_urmProcessParams);
  347. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  348. unsafe
  349. {
  350. fixed (URMPoint* AllPointsPtr = urmPoints)
  351. {
  352. fixed (int* pointlengthsptr = Pointsnums)
  353. {
  354. _urmProcessAlg.PreURMVideo(_urmVideoParam, AllPointsPtr, Pointsnums.Length, pointlengthsptr, ref urmMaxVal, ref urmMinVal);
  355. }
  356. }
  357. }
  358. videoColorTable = GetURMColorMap("SRColorMap:ColorMap4");
  359. Logger.WriteLineInfo($"PreURMVideo urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  360. }
  361. // public void getURMVideoImg(int index, WriteableBitmap dataHolder)
  362. // {
  363. // _urmProcessAlg.DrawURMVideo(index, videoColorTable.Address, Mixflag);
  364. // Int32Rect rect = new Int32Rect(0, 0, ScreenWidth, ScreenHeight);
  365. // dataHolder.WritePixels(rect, imagePixels, ScreenWidth * 4, 0);
  366. // }
  367. public string getURMVideoImg(int index)
  368. {
  369. _urmProcessAlg.DrawURMVideo(index, videoColorTable.Address, Mixflag);
  370. SKImageInfo info = new SKImageInfo(ScreenWidth, ScreenHeight, SKColorType.Bgra8888, SKAlphaType.Unpremul);
  371. // Create an SKBitmap with the given SKImageInfo
  372. SKBitmap skBitmap = new SKBitmap(info);
  373. // Copy the pixel data from the imagePixels array to the SKBitmap
  374. using (SKImage skImage = SKImage.FromPixelCopy(info, imagePixels))
  375. {
  376. skImage.ReadPixels(skBitmap.Info, skBitmap.GetPixels(), skBitmap.RowBytes, 0, 0);
  377. }
  378. using (var image = SKImage.FromBitmap(skBitmap))
  379. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  380. {
  381. byte[] imageBytes = data.ToArray();
  382. string base64String = Convert.ToBase64String(imageBytes);
  383. return base64String;
  384. }
  385. }
  386. public void CreateURMMeasuerImg(URMType urmtype, IntPtr MeasureImgStart, ref double max, ref double min)
  387. {
  388. if (urmtype == URMType.Den)
  389. {
  390. _urmProcessAlg.CalURMMeasurImg(MeasureImgStart, (int)urmtype, ref max,
  391. ref min);
  392. }
  393. else if (urmtype == URMType.Vel)
  394. {
  395. _urmProcessAlg.CalURMMeasurImg(MeasureImgStart, (int)urmtype, ref max,
  396. ref min);
  397. }
  398. }
  399. public unsafe string CreateUrmColorbarImage()
  400. {
  401. SKImageInfo info = new SKImageInfo(10, 128, SKColorType.Bgra8888, SKAlphaType.Unpremul);
  402. // Create an SKBitmap with the given SKImageInfo
  403. SKBitmap bitmap = new SKBitmap(info);
  404. var res = GetIntPow();
  405. var ismidecenter = res.Item1;
  406. var intpow = res.Item2;//通过修改这个值 colorbar的颜色会有变化,视频的话这个是1
  407. var urmcolormapname = getColormapname((int)_urmType.Current);
  408. var colorbarTable = GetURMColorMap(urmcolormapname);
  409. var tablelength = colorbarTable.Length / 4;
  410. byte[] rgbTable = new byte[tablelength * 3];
  411. var midlength = tablelength / 2;
  412. double midpow = Math.Pow((double)(midlength), intpow);
  413. double maxpow = Math.Pow((double)(tablelength - 1), intpow);
  414. byte* source = (byte*)colorbarTable.Address;
  415. for (int i = 0; i < tablelength; i++)
  416. {
  417. int index = i;
  418. if (ismidecenter)
  419. {
  420. if (i > midlength)
  421. {
  422. index = (int)(Math.Pow((double)i - midlength, intpow) / midpow * (midlength)) +
  423. midlength;
  424. }
  425. else if (i < midlength)
  426. {
  427. index = midlength - (int)(Math.Pow((double)midlength - i, intpow) / midpow *
  428. (midlength));
  429. }
  430. }
  431. else
  432. {
  433. index = (int)(Math.Pow((double)i, intpow) / maxpow * (tablelength - 1));
  434. }
  435. if (index < 0)
  436. index = 0;
  437. if (index > tablelength - 1)
  438. index = tablelength - 1;
  439. byte r = (byte)source[4 * index + 2];
  440. byte g = (byte)source[4 * index + 1];
  441. byte b = (byte)source[4 * index];
  442. rgbTable[i * 3] = r;
  443. rgbTable[i * 3 + 1] = g;
  444. rgbTable[i * 3 + 2] = b;
  445. }
  446. // Different platforms have different color formats,
  447. // such as ARGB for Windows and ABGR for Android.
  448. // So by default its default value is TRUE, which is FALSE on Android
  449. bool isArgbFormat = (ServiceManager.Os != VinnoOsPlatform.Android);
  450. int height = bitmap.Height;
  451. int width = bitmap.Width;
  452. SKColor* pixels = (SKColor*)bitmap.GetPixels();
  453. for (int y = 0; y < height; y++)
  454. {
  455. int col = y * tablelength / height;
  456. int rowStart = (height - 1 - y) * width;
  457. for (int x = 0; x < width; x++)
  458. {
  459. int index = col;
  460. try
  461. {
  462. SKColor color;
  463. if (isArgbFormat)
  464. {
  465. color = new SKColor(rgbTable[index * 3], rgbTable[index * 3 + 1], rgbTable[index * 3 + 2]);
  466. }
  467. else
  468. {
  469. color = new SKColor(rgbTable[index * 3 + 2], rgbTable[index * 3 + 1], rgbTable[index * 3]);
  470. }
  471. pixels[rowStart + x] = color;
  472. }
  473. catch (Exception ex)
  474. {
  475. Logger.WriteLineError($"x:{x}, y:{y}, index:{index}, ex:{ex.Message}");
  476. throw;
  477. }
  478. }
  479. }
  480. using (var image = SKImage.FromBitmap(bitmap))
  481. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  482. {
  483. byte[] imageBytes = data.ToArray();
  484. string base64String = Convert.ToBase64String(imageBytes);
  485. return base64String;
  486. }
  487. }
  488. private Tuple<bool, double> GetIntPow()
  489. {
  490. bool ismidecenter = false;
  491. double intpow = 0d;
  492. URMType urmType = _urmType.Current;
  493. switch (urmType)
  494. {
  495. case URMType.Den:
  496. ismidecenter = false;
  497. intpow = _urmProcessParams.IntPowerDen;
  498. break;
  499. case URMType.Dir:
  500. ismidecenter = true;
  501. intpow = _urmProcessParams.IntPowerDir;
  502. break;
  503. case URMType.Vel:
  504. intpow = 1;
  505. ismidecenter = false;
  506. break;
  507. case URMType.Angle:
  508. break;
  509. default:
  510. ismidecenter = false;
  511. break;
  512. }
  513. return Tuple.Create<bool, double>(ismidecenter, intpow);
  514. }
  515. public void Dispose()
  516. {
  517. try
  518. {
  519. handle.Free();
  520. }
  521. catch (Exception ex)
  522. {
  523. Logger.WriteLineWarn(ex.ToString());
  524. }
  525. try
  526. {
  527. _urmProcessAlg.Release();
  528. }
  529. catch (Exception ex)
  530. {
  531. Logger.WriteLineWarn(ex.ToString());
  532. }
  533. if (ImagePP != null)
  534. {
  535. try
  536. {
  537. ImagePP.Dispose();
  538. ImagePP = null;
  539. }
  540. catch (Exception ex)
  541. {
  542. Logger.WriteLineWarn(ex.ToString());
  543. }
  544. }
  545. }
  546. }
  547. }