ImageViewerWindow.xaml.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Input;
  5. using System.Windows.Media;
  6. using System.Windows.Media.Animation;
  7. namespace MeterVision
  8. {
  9. public partial class ImageViewerWindow : Window
  10. {
  11. private double zoomFactor = 1.0;
  12. private RotateTransform rotateTransform = new RotateTransform();
  13. private Point? dragStartPoint = null;
  14. private TranslateTransform translateTransform = new TranslateTransform();
  15. public ImageViewerWindow(string imageSourcePath)
  16. {
  17. InitializeComponent();
  18. imgViewer.Source = new System.Windows.Media.Imaging.BitmapImage(new Uri(imageSourcePath, UriKind.RelativeOrAbsolute));
  19. imgViewer.RenderTransform = rotateTransform; // Initialize the rotation transform
  20. }
  21. // Zoom in button click event
  22. private void ZoomIn_Click(object sender, RoutedEventArgs e)
  23. {
  24. zoomFactor *= 1.2; // Increase zoom factor by 20%
  25. ApplyZoom();
  26. }
  27. // Zoom out button click event
  28. private void ZoomOut_Click(object sender, RoutedEventArgs e)
  29. {
  30. zoomFactor /= 1.2; // Decrease zoom factor by 20%
  31. ApplyZoom();
  32. }
  33. // Rotate left button click event
  34. private void RotateLeft_Click(object sender, RoutedEventArgs e)
  35. {
  36. //rotateTransform.Angle -= 90; // Rotate 90 degrees counterclockwise
  37. AnimateRotation(-90); // Rotate 90 degrees counterclockwise
  38. }
  39. // Rotate right button click event
  40. private void RotateRight_Click(object sender, RoutedEventArgs e)
  41. {
  42. //rotateTransform.Angle += 90; // Rotate 90 degrees clockwise
  43. AnimateRotation(90); // Rotate 90 degrees clockwise
  44. }
  45. private void AnimateRotation(double angle)
  46. {
  47. rotateTransform.Angle += angle;
  48. // Apply the animation to the rotation transform
  49. var animation = new DoubleAnimation(rotateTransform.Angle, TimeSpan.FromSeconds(0.3));
  50. imgViewer.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, animation);
  51. }
  52. private void Reset_Click(object sender, RoutedEventArgs e)
  53. {
  54. zoomFactor = 1.0;
  55. rotateTransform.Angle = 0;
  56. // Reset the transforms
  57. imgViewer.RenderTransform = null;
  58. imgViewer.RenderTransform = rotateTransform; // Reapply the rotation transform
  59. ApplyZoom();
  60. }
  61. // Apply the current zoom factor to the image
  62. private void ApplyZoom()
  63. {
  64. // Ensure the zoom factor stays within reasonable bounds
  65. if (zoomFactor < 0.1) zoomFactor = 0.1;
  66. if (zoomFactor > 10.0) zoomFactor = 10.0;
  67. // Create a ScaleTransform to apply the zoom
  68. ScaleTransform scaleTransform = new ScaleTransform(zoomFactor, zoomFactor);
  69. // Combine the scale and rotation transforms
  70. TransformGroup transformGroup = new TransformGroup();
  71. transformGroup.Children.Add(scaleTransform);
  72. transformGroup.Children.Add(rotateTransform);
  73. // Apply the combined transform to the image
  74. imgViewer.RenderTransform = transformGroup;
  75. }
  76. private bool isZoomedToFit = false;
  77. private void ImgViewer_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  78. {
  79. if (e.ClickCount == 2)
  80. {
  81. if (isZoomedToFit)
  82. {
  83. // Restore original size
  84. zoomFactor = 1.0;
  85. isZoomedToFit = false;
  86. }
  87. else
  88. {
  89. // Fit image to window
  90. double scaleX = imgViewer.ActualWidth / imgViewer.Source.Width;
  91. double scaleY = imgViewer.ActualHeight / imgViewer.Source.Height;
  92. zoomFactor = Math.Min(scaleX, scaleY);
  93. isZoomedToFit = true;
  94. }
  95. ApplyZoom();
  96. }
  97. }
  98. private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
  99. {
  100. // Handle mouse wheel for zooming
  101. if (Keyboard.Modifiers == ModifierKeys.Control)
  102. {
  103. if (e.Delta > 0)
  104. {
  105. zoomFactor *= 1.2; // Increase zoom factor by 20%
  106. ApplyZoom(); // 调用 ApplyTransforms 方法
  107. }
  108. else
  109. {
  110. zoomFactor /= 1.2; // Decrease zoom factor by 20%
  111. ApplyZoom();
  112. }
  113. e.Handled = true;
  114. }
  115. }
  116. private void ScrollViewer_PreviewMouseDown(object sender, MouseButtonEventArgs e)
  117. {
  118. dragStartPoint = e.GetPosition(imgViewer);
  119. }
  120. private void ScrollViewer_PreviewMouseMove(object sender, MouseEventArgs e)
  121. {
  122. if (dragStartPoint.HasValue && e.LeftButton == MouseButtonState.Pressed)
  123. {
  124. Point currentPoint = e.GetPosition(imgViewer);
  125. double deltaX = currentPoint.X - dragStartPoint.Value.X;
  126. double deltaY = currentPoint.Y - dragStartPoint.Value.Y;
  127. translateTransform.X += deltaX;
  128. translateTransform.Y += deltaY;
  129. dragStartPoint = currentPoint;
  130. }
  131. }
  132. private void ScrollViewer_PreviewMouseUp(object sender, MouseButtonEventArgs e)
  133. {
  134. dragStartPoint = null;
  135. }
  136. //private void SaveState()
  137. //{
  138. // //Properties.Settings.Default.ZoomFactor = zoomFactor;
  139. // //Properties.Settings.Default.RotationAngle = rotateTransform.Angle;
  140. // //Properties.Settings.Default.TranslateX = translateTransform.X;
  141. // //Properties.Settings.Default.TranslateY = translateTransform.Y;
  142. // Properties.Settings.Default.Save();
  143. //}
  144. //private void LoadState()
  145. //{
  146. // //zoomFactor = Properties.Settings.Default.ZoomFactor;
  147. // //rotateTransform.Angle = Properties.Settings.Default.RotationAngle;
  148. // //translateTransform.X = Properties.Settings.Default.TranslateX;
  149. // //translateTransform.Y = Properties.Settings.Default.TranslateY;
  150. // ApplyTransforms();
  151. //}
  152. //// 调用 LoadState 在窗口加载时恢复状态
  153. //protected override void OnInitialized(EventArgs e)
  154. //{
  155. // base.OnInitialized(e);
  156. // LoadState();
  157. //}
  158. // 调用 SaveState 在窗口关闭时保存状态
  159. //protected override void OnClosing(CancelEventArgs e)
  160. //{
  161. // SaveState();
  162. // base.OnClosing(e);
  163. //}
  164. }
  165. }