AIDiagnosisService.ImageResize.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using WingServerCommon.Service;
  2. using WingInterfaceLibrary.Interface;
  3. using System.Threading.Tasks;
  4. using WingServerCommon.Log;
  5. using WingInterfaceLibrary.Request.AIDiagnosis;
  6. using ImageResizeLib;
  7. using System.IO;
  8. using System;
  9. using AI.Common;
  10. using Vinno.vCloud.Common.Vid2;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using AI.Common.Log;
  14. using System.Drawing;
  15. using SkiaSharp;
  16. namespace WingAIDiagnosisService.Service
  17. {
  18. /// <summary>
  19. /// URM分析服务
  20. /// </summary>
  21. public partial class AIDiagnosisService : JsonRpcService, IAIDiagnosisService
  22. {
  23. private ImageResize _imageResize;
  24. private ImageResize ImageResize
  25. {
  26. get
  27. {
  28. if (_imageResize == null)
  29. {
  30. var modelFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AIDiagnosis", "ImageResize");
  31. _imageResize = new ImageResize(modelFolder);
  32. _imageResize.NotifyError += ImageResize_NotifyError;
  33. _imageResize.NotifyLog += ImageResize_NotifyLog;
  34. }
  35. return _imageResize;
  36. }
  37. }
  38. /// <summary>
  39. /// 远程图像区域缩放
  40. /// </summary>
  41. /// <param name="request">远程图像区域缩放请求实体</param>
  42. /// <returns>远程图像区域缩放结果</returns>
  43. /// <value></value>
  44. /// <errorCodes></errorCodes>
  45. public async Task<VidImageZoomResult> VidImageZoomAsync(VidImageZoomRequest request)
  46. {
  47. var remedicalCode = request.RemedicalCode;
  48. var currentFolder = string.Empty;
  49. var resultData = new VidImageZoomResult();
  50. try
  51. {
  52. if (!string.IsNullOrWhiteSpace(remedicalCode))
  53. {
  54. Logger.WriteLineInfo($"AIDiagnosisService VidImageZoomAsync start, remedicalCode:{remedicalCode}");
  55. var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
  56. if (remedical != null)
  57. {
  58. var fileToken = remedical.ImgList?.FirstOrDefault(x => x.ImgType == 5)?.FileToken;
  59. if (string.IsNullOrWhiteSpace(fileToken))
  60. {
  61. fileToken = remedical.TerminalImages?.OriginImageUrl;
  62. }
  63. var origialName = Path.GetFileName(fileToken);
  64. currentFolder = Path.Combine(_urmTempFolder, Guid.NewGuid().ToString("N"));
  65. if (!Directory.Exists(currentFolder))
  66. {
  67. Directory.CreateDirectory(currentFolder);
  68. }
  69. var origialFile = Path.Combine(currentFolder, origialName);
  70. if (!File.Exists(origialFile))
  71. {
  72. await DownloadToLocalAsync(fileToken, origialFile, "", remedicalCode);
  73. await Task.Delay(50);
  74. }
  75. if (File.Exists(origialFile))
  76. {
  77. Logger.WriteLineInfo($"AIDiagnosisService VidImageZoomAsync download success, remedicalCode:{remedicalCode}");
  78. using (var imageData = new VinnoImageData(origialFile, OperationMode.Open))
  79. {
  80. var frameIndex = request.FrameIndex;
  81. if (imageData.ImageCount < frameIndex)
  82. {
  83. frameIndex = 0;
  84. }
  85. var frameImage = imageData.GetImage(frameIndex);
  86. using (var bitmap = CreateBitmap(frameImage))
  87. {
  88. Logger.WriteLineInfo($"AIDiagnosisService VidImageZoomAsync RawImage, remedicalCode:{remedicalCode}");
  89. using (var rawImage = new RawImage(bitmap.Bytes, bitmap.Width, bitmap.Height, MapTo(bitmap.ColorType)))
  90. {
  91. // File.WriteAllBytes(Path.Combine(currentFolder, "123123.png"), frameImage.ImageData);
  92. Logger.WriteLineInfo($"AIDiagnosisService VidImageZoomAsync ImageRegion, remedicalCode:{remedicalCode}");
  93. var imageRegion = new List<Rect>();
  94. if (request.ImageRegion?.Any() ?? false)
  95. {
  96. foreach (var item in request.ImageRegion)
  97. {
  98. imageRegion.Add(new Rect((int)item.Left, (int)item.Top, (int)item.Width, (int)item.Height));
  99. }
  100. }
  101. var sampleBoxReq = request.SampleBox ?? new ImageRect();
  102. var sampleBox = new AI.Common.Rectangle(new Rect((int)sampleBoxReq.Left, (int)sampleBoxReq.Top, (int)sampleBoxReq.Width, (int)sampleBoxReq.Height));
  103. var resizeType = (EnumResizeMethodType)request.ResizeType;
  104. Logger.WriteLineInfo($"AIDiagnosisService VidImageZoomAsync PushOneImage, remedicalCode:{remedicalCode}");
  105. Logger.WriteLineInfo($"imageRegion:{Newtonsoft.Json.JsonConvert.SerializeObject(imageRegion)}");
  106. Logger.WriteLineInfo($"sampleBox:{Newtonsoft.Json.JsonConvert.SerializeObject(sampleBox)}");
  107. var imageResizeBytes = ImageResize.PushOneImage(rawImage, imageRegion.ToArray(), sampleBox, resizeType);
  108. if (imageResizeBytes != null)
  109. {
  110. SKImageInfo info = new SKImageInfo((int)bitmap.Width, (int)bitmap.Height, SKColorType.Bgra8888, SKAlphaType.Unpremul);
  111. // Create an SKBitmap with the given SKImageInfo
  112. using (SKBitmap skBitmap = new SKBitmap(info))
  113. {
  114. // Copy the pixel data from the imagePixels array to the SKBitmap
  115. using (SKImage skImage = SKImage.FromPixelCopy(info, imageResizeBytes))
  116. {
  117. skImage?.ReadPixels(skBitmap.Info, skBitmap.GetPixels(), skBitmap.RowBytes, 0, 0);
  118. }
  119. using (var image = SKImage.FromBitmap(skBitmap))
  120. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  121. {
  122. byte[] imageBytes = data.ToArray();
  123. resultData.Base64String = Convert.ToBase64String(imageBytes);
  124. }
  125. }
  126. }
  127. }
  128. Logger.WriteLineInfo($"AIDiagnosisService VidImageZoomAsync end, remedicalCode:{remedicalCode}");
  129. }
  130. }
  131. }
  132. }
  133. }
  134. }
  135. catch (Exception ex)
  136. {
  137. Logger.WriteLineWarn($"AIDiagnosisService VidImageZoomAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
  138. }
  139. finally
  140. {
  141. Logger.WriteLineInfo($"AIDiagnosisService VidImageZoomAsync finally, remedicalCode:{remedicalCode}");
  142. try
  143. {
  144. if (Directory.Exists(currentFolder))
  145. {
  146. Directory.Delete(currentFolder, true);
  147. }
  148. }
  149. catch { }
  150. }
  151. return resultData;
  152. }
  153. private void ImageResize_NotifyError(object sender, ErrorEventArgs e)
  154. {
  155. try
  156. {
  157. Logger.WriteLineWarn($"AIDiagnosisService ImageResize_NotifyError: {e.GetException()}");
  158. }
  159. catch { }
  160. }
  161. private void ImageResize_NotifyLog(object sender, LogEventArgs e)
  162. {
  163. try
  164. {
  165. if (e?.LogType == EnumLogType.WarnLog || e?.LogType == EnumLogType.ErrorLog)
  166. {
  167. Logger.WriteLineWarn($"AIDiagnosisService ImageResize_NotifyLog. LogType: {e.LogType}, Msg: {e.Msg}");
  168. }
  169. else
  170. {
  171. Logger.WriteLineInfo($"AIDiagnosisService ImageResize_NotifyLog. LogType: {e.LogType}, Msg: {e.Msg}");
  172. }
  173. }
  174. catch { }
  175. }
  176. }
  177. }