MainWindow.xaml.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. using System;
  2. using System.Drawing;
  3. using System.IO;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Forms;
  7. using System.Windows.Media;
  8. using System.Windows.Media.Imaging;
  9. using System.Windows.Threading;
  10. using Vinno.vCloud.Common.Vid2;
  11. using Vinno.vCloud.Common.Vid2.Visuals;
  12. using System.Drawing.Imaging;
  13. using SkiaSharp;
  14. using Vinno.vCloud.Common.Vid2.Codec;
  15. namespace VidTool
  16. {
  17. /// <summary>
  18. /// Interaction logic for MainWindow.xaml
  19. /// </summary>
  20. public partial class MainWindow : Window
  21. {
  22. private VinnoImageData _opendVinnoImageData;
  23. private int _currentIndex;
  24. private readonly DispatcherTimer _playTimer;
  25. public MainWindow()
  26. {
  27. InitializeComponent();
  28. _playTimer = new DispatcherTimer();
  29. _playTimer.Tick += PlayTimerOnTick;
  30. PlayButton.IsEnabled = false;
  31. PauseButton.IsEnabled = false;
  32. NextButton.IsEnabled = false;
  33. PreviousButton.IsEnabled = false;
  34. }
  35. private void OnEncodeClick(object sender, RoutedEventArgs e)
  36. {
  37. var dialog = new FolderBrowserDialog();
  38. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  39. {
  40. var foldPath = dialog.SelectedPath;
  41. var files = Directory.GetFiles(foldPath, "*.bmp");
  42. if (files.Length > 0)
  43. {
  44. var encoder = new VinnoImageEncoder(0.8f, 0.8f);
  45. var filePath = Path.Combine(foldPath, "test.vid");
  46. var imageData = new VinnoImageData(filePath, OperationMode.Create);
  47. var probe = new VinnoProbe("G1-4PX", VinnoProbeType.Sector, new VinnoApplication("Adult1", string.Empty, "Adult1", "CARD", false), 30);
  48. imageData.AddProbe(probe);
  49. foreach (var file in files)
  50. {
  51. var bmp = new Bitmap(file);
  52. using (var stream = new MemoryStream())
  53. {
  54. bmp.Save(stream, ImageFormat.Jpeg);
  55. var skipBitMap = SKBitmap.Decode(stream);
  56. var image = encoder.Encode(skipBitMap);
  57. bmp.Dispose();
  58. var visual = new Vinno2DVisual();
  59. visual.Modes.Add(new VinnoMode("HAR", "HAR", VinnoModeType.Tissue));
  60. visual.ActiveModeType = VinnoModeType.Tissue;
  61. var physicalCoordinateInfo = new VinnoConvexTissuePhysicalCoordinate(15.99, 0, 80, 0, 0.11);
  62. var logicalCoordinateInfo = new VinnoLogicalCoordinate(true, false, new VinnoRect(-12.04, -0.025, 24.08, 16.02), VinnoUnit.cm, VinnoUnit.cm);
  63. visual.PhysicalCoordinates.Add(VinnoVisualAreaType.Tissue, physicalCoordinateInfo);
  64. visual.LogicalCoordinates.Add(VinnoVisualAreaType.Tissue, logicalCoordinateInfo);
  65. image.Visuals.Add(visual);
  66. imageData.AddImage(image);
  67. skipBitMap.Dispose();
  68. }
  69. }
  70. imageData.Dispose();
  71. System.Windows.MessageBox.Show("Encode finished.");
  72. }
  73. }
  74. }
  75. private BitmapSource BitmapToBitmapSource(byte[] bytes)
  76. {
  77. var bitmapImage = new BitmapImage();
  78. bitmapImage.BeginInit();
  79. bitmapImage.StreamSource = new MemoryStream(bytes);
  80. bitmapImage.EndInit();
  81. return bitmapImage;
  82. }
  83. private void Play(int index)
  84. {
  85. if (_opendVinnoImageData != null)
  86. {
  87. if (index > _opendVinnoImageData.ImageCount - 1)
  88. {
  89. index = 0;
  90. }
  91. if (index < 0)
  92. {
  93. index = 0;
  94. }
  95. var vinnoImage = _opendVinnoImageData.GetImage(index);
  96. DisplayImage.Source = BitmapToBitmapSource(vinnoImage.ImageData);
  97. Properties.Items.Clear();
  98. var probeNameNode = new TreeViewItem { Header = $"Name: {_opendVinnoImageData.Probe.Name}" };
  99. var probeTypeNode = new TreeViewItem { Header = $"Type: {_opendVinnoImageData.Probe.Type}" };
  100. var probeApplicationNode = new TreeViewItem { Header = $"Application: {_opendVinnoImageData.Probe.Application.ApplicationCategoryName}-{_opendVinnoImageData.Probe.Application.ApplicationName}" };
  101. var frameRateNode = new TreeViewItem { Header = $"Framerate: {_opendVinnoImageData.Probe.FrameRate}" };
  102. var probeNode = new TreeViewItem { Header = "Probe" };
  103. probeNode.Items.Add(probeNameNode);
  104. probeNode.Items.Add(probeTypeNode);
  105. probeNode.Items.Add(probeApplicationNode);
  106. probeNode.Items.Add(frameRateNode);
  107. probeNode.IsExpanded = true;
  108. var indexNode = new TreeViewItem { Header = $"Index: {vinnoImage.Index}" };
  109. var widthNode = new TreeViewItem { Header = $"Width: {vinnoImage.Width}" };
  110. var heightNode = new TreeViewItem { Header = $"Height: {vinnoImage.Height}" };
  111. var visualsNode = new TreeViewItem { Header = "Visuals" };
  112. foreach (var visual in vinnoImage.Visuals)
  113. {
  114. var visualNode = new TreeViewItem { Header = $"Visual - {visual.Indicator}" };
  115. var displayModeNode = new TreeViewItem { Header = $"DisplayMode: {visual.DisplayMode}" };
  116. var activeModeNode = new TreeViewItem { Header = $"ActiveModeType: {visual.ActiveModeType}" };
  117. var modesNode = new TreeViewItem() { Header = "Modes" };
  118. foreach (var mode in visual.Modes)
  119. {
  120. var modeNameNode = new TreeViewItem { Header = $"ActiveModeType: {mode.DisplayName}" };
  121. var modeTypeNode = new TreeViewItem { Header = $"Type: {mode.Type}" };
  122. modesNode.Items.Add(modeNameNode);
  123. modesNode.Items.Add(modeTypeNode);
  124. }
  125. modesNode.IsExpanded = true;
  126. visualNode.Items.Add(displayModeNode);
  127. visualNode.Items.Add(activeModeNode);
  128. visualNode.Items.Add(modesNode);
  129. if (visual is Vinno2DVisual v2D)
  130. {
  131. var physicalCoordinatesNode = new TreeViewItem() { Header = "PhysicalCoordinates" };
  132. foreach (var physicalCoordinate in v2D.PhysicalCoordinates)
  133. {
  134. var physicalCoordinateNode = new TreeViewItem { Header = physicalCoordinate.Key };
  135. var physicalCoordinateProperties = physicalCoordinate.Value.GetType().GetProperties();
  136. foreach (var physicalCoordinateProperty in physicalCoordinateProperties)
  137. {
  138. var header =
  139. $"{physicalCoordinateProperty.Name}: {physicalCoordinateProperty.GetValue(physicalCoordinate.Value)}";
  140. physicalCoordinateNode.Items.Add(new TreeViewItem { Header = header });
  141. }
  142. physicalCoordinateNode.IsExpanded = true;
  143. physicalCoordinatesNode.Items.Add(physicalCoordinateNode);
  144. }
  145. physicalCoordinatesNode.IsExpanded = true;
  146. visualNode.Items.Add(physicalCoordinatesNode);
  147. var logicalCoordinatesNode = new TreeViewItem() { Header = "LogicalCoordinates" };
  148. foreach (var logicalCoordinate in v2D.LogicalCoordinates)
  149. {
  150. var logicalCoordinateNode = new TreeViewItem { Header = logicalCoordinate.Key };
  151. var logicalCoordinateProperties = logicalCoordinate.Value.GetType().GetProperties();
  152. foreach (var logicalCoordinateProperty in logicalCoordinateProperties)
  153. {
  154. var header =
  155. $"{logicalCoordinateProperty.Name}: {logicalCoordinateProperty.GetValue(logicalCoordinate.Value)}";
  156. logicalCoordinateNode.Items.Add(new TreeViewItem { Header = header });
  157. }
  158. logicalCoordinateNode.IsExpanded = true;
  159. logicalCoordinatesNode.Items.Add(logicalCoordinateNode);
  160. }
  161. logicalCoordinatesNode.IsExpanded = true;
  162. visualNode.Items.Add(logicalCoordinatesNode);
  163. }
  164. else
  165. {
  166. var v3d = (Vinno3DVisual)visual;
  167. var tissue3DAreasNode = new TreeViewItem() { Header = "Tissue3DAreas" };
  168. foreach (var tissue3DArea in v3d.Tissue3DAreas)
  169. {
  170. var tissue3DAreaNode = new TreeViewItem { Header = tissue3DArea.Indicator };
  171. tissue3DAreaNode.Items.Add(new TreeViewItem()
  172. {
  173. Header = $"Indicator: {tissue3DArea.Indicator}"
  174. });
  175. tissue3DAreaNode.Items.Add(new TreeViewItem()
  176. {
  177. Header = $"GlobalOffset: {tissue3DArea.GlobalOffset}"
  178. });
  179. tissue3DAreaNode.Items.Add(new TreeViewItem()
  180. {
  181. Header = $"CmPerPixel: {tissue3DArea.CmPerPixel}"
  182. });
  183. tissue3DAreaNode.Items.Add(new TreeViewItem()
  184. {
  185. Header = $"Bounds: {tissue3DArea.Bounds}"
  186. });
  187. tissue3DAreaNode.IsExpanded = true;
  188. tissue3DAreasNode.Items.Add(tissue3DAreaNode);
  189. }
  190. tissue3DAreasNode.IsExpanded = true;
  191. visualNode.Items.Add(tissue3DAreasNode);
  192. }
  193. visualNode.IsExpanded = true;
  194. visualsNode.Items.Add(visualNode);
  195. }
  196. visualsNode.IsExpanded = true;
  197. var imageNode = new TreeViewItem { Header = "Image" };
  198. imageNode.Items.Add(indexNode);
  199. imageNode.Items.Add(widthNode);
  200. imageNode.Items.Add(heightNode);
  201. imageNode.Items.Add(visualsNode);
  202. imageNode.IsExpanded = true;
  203. Properties.Items.Add(probeNode);
  204. Properties.Items.Add(imageNode);
  205. _currentIndex = index;
  206. PlaySlider.Value = _currentIndex;
  207. if (Math.Abs(_currentIndex % _opendVinnoImageData.Probe.FrameRate) < 0.001)
  208. {
  209. GC.Collect();
  210. }
  211. }
  212. }
  213. private void OnDecodeClick(object sender, RoutedEventArgs e)
  214. {
  215. var dialog = new OpenFileDialog { Filter = "*.vid|*.vid" };
  216. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  217. {
  218. _playTimer.Stop();
  219. _opendVinnoImageData?.Dispose();
  220. _opendVinnoImageData = new VinnoImageData(dialog.FileName, OperationMode.Open);
  221. PlaySlider.Minimum = 0;
  222. PlaySlider.Maximum = _opendVinnoImageData.ImageCount - 1;
  223. Max.Text = (_opendVinnoImageData.ImageCount - 1).ToString();
  224. Play(0);
  225. PlayButton.IsEnabled = true;
  226. PauseButton.IsEnabled = false;
  227. NextButton.IsEnabled = true;
  228. PreviousButton.IsEnabled = true;
  229. }
  230. }
  231. private void OnNextClick(object sender, RoutedEventArgs e)
  232. {
  233. OnPauseClick(this, null);
  234. Play(_currentIndex + 1);
  235. }
  236. private void OnPreviousClick(object sender, RoutedEventArgs e)
  237. {
  238. OnPauseClick(this, null);
  239. Play(_currentIndex - 1);
  240. }
  241. private void OnPlaySliderValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  242. {
  243. var index = (int)e.NewValue;
  244. Play(index);
  245. }
  246. private void PlayTimerOnTick(object sender, EventArgs eventArgs)
  247. {
  248. Play(_currentIndex + 1);
  249. }
  250. private void OnPlayClick(object sender, RoutedEventArgs e)
  251. {
  252. if (_opendVinnoImageData != null)
  253. {
  254. _playTimer.Interval = TimeSpan.FromMilliseconds(1000 / _opendVinnoImageData.Probe.FrameRate);
  255. _playTimer.Start();
  256. PlayButton.IsEnabled = false;
  257. PauseButton.IsEnabled = true;
  258. }
  259. }
  260. private void OnPauseClick(object sender, RoutedEventArgs e)
  261. {
  262. _playTimer.Stop();
  263. PlayButton.IsEnabled = true;
  264. PauseButton.IsEnabled = false;
  265. }
  266. }
  267. }