Browse Source

[Avalonia] Exif rotation, refactor

Ruben 1 year ago
parent
commit
feb760b027

+ 10 - 10
src/PicView.Avalonia/Clipboard/ClipboardHelper.cs

@@ -126,62 +126,62 @@ public static class ClipboardHelper
         var bitmap = await GetBitmapFromBytes("PNG");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         
         bitmap = await GetBitmapFromBytes("image/jpeg");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("image/png");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("image/bmp");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("BMP");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("JPG");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("JPEG");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("image/tiff");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("GIF");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         bitmap = await GetBitmapFromBytes("image/gif");
         if (bitmap is not null)
         {
-            ImageHelper.SetSingleImage(bitmap, name, vm);
+            NavigationHelper.SetSingleImage(bitmap, name, vm);
             return;
         }
         return;

+ 0 - 33
src/PicView.Avalonia/ImageHandling/ImageHelper.cs

@@ -216,37 +216,4 @@ public static class ImageHelper
             _ => imageControl.Source
         };
     }
-
-    public static void SetSingleImage(Bitmap bitmap, string name, MainViewModel vm)
-    {
-        Dispatcher.UIThread.InvokeAsync(() =>
-        {
-            if (vm.CurrentView != vm.ImageViewer)
-            {
-                vm.CurrentView = vm.ImageViewer;
-            }
-        }, DispatcherPriority.Render);
-
-        vm.ImageIterator = null;
-        vm.ImageSource = bitmap;
-        vm.ImageType = ImageType.Bitmap;
-        var width = bitmap.PixelSize.Width;
-        var height = bitmap.PixelSize.Height;
-
-        if (GalleryFunctions.IsBottomGalleryOpen)
-        {
-            Dispatcher.UIThread.InvokeAsync(() =>
-            {
-                // Trigger animation
-                vm.GalleryMode = GalleryMode.BottomToClosed;
-            });
-            // Set to closed to ensure next gallery mode changing is fired
-            vm.GalleryMode = GalleryMode.Closed;
-        }
-        WindowHelper.SetSize(width, height, vm);
-        var titleString = TitleHelper.TitleString(width, height, name, 1);
-        vm.WindowTitle = titleString[0];
-        vm.Title = titleString[1];
-        vm.TitleTooltip = titleString[1];
-    }
 }

+ 4 - 0
src/PicView.Avalonia/Navigation/ImageIterator.cs

@@ -606,6 +606,10 @@ public sealed class ImageIterator : IDisposable
         _vm.ImageSource = preLoadValue.ImageModel.Image;
         _vm.ImageType = preLoadValue.ImageModel.ImageType;
         WindowHelper.SetSize(preLoadValue.ImageModel.PixelWidth, preLoadValue.ImageModel.PixelHeight, preLoadValue.ImageModel.Rotation, _vm);
+        if (_vm.RotationAngle != 0)
+        {
+            _vm.ImageViewer.Rotate(_vm.RotationAngle);
+        }
         SetTitleHelper.SetTitle(_vm, preLoadValue.ImageModel);
         _vm.GetIndex = Index + 1;
         if (SettingsHelper.Settings.WindowProperties.KeepCentered)

+ 39 - 4
src/PicView.Avalonia/Navigation/NavigationHelper.cs

@@ -1,5 +1,4 @@
 using Avalonia;
-using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Controls;
 using Avalonia.Media.Imaging;
 using Avalonia.Threading;
@@ -8,7 +7,6 @@ using PicView.Avalonia.Gallery;
 using PicView.Avalonia.ImageHandling;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.ViewModels;
-using PicView.Avalonia.Views;
 using PicView.Core.Config;
 using PicView.Core.FileHandling;
 using PicView.Core.Gallery;
@@ -274,7 +272,7 @@ public static class NavigationHelper
             default:
                 var fileInfo = new FileInfo(check);
                 var imageModel = await ImageHelper.GetImageModelAsync(fileInfo).ConfigureAwait(false);
-                ImageHelper.SetSingleImage(imageModel.Image as Bitmap, url, vm);
+                SetSingleImage(imageModel.Image as Bitmap, url, vm);
                 vm.FileInfo = fileInfo;
                 ExifHandling.SetImageModel(imageModel, vm);
                 ExifHandling.UpdateExifValues(imageModel, vm);
@@ -318,7 +316,7 @@ public static class NavigationHelper
                 PixelHeight = bitmap?.PixelSize.Height ?? 0,
                 ImageType = ImageType.Bitmap
             };
-            ImageHelper.SetSingleImage(imageModel.Image as Bitmap, TranslationHelper.Translation.Base64Image, vm);
+            SetSingleImage(imageModel.Image as Bitmap, TranslationHelper.Translation.Base64Image, vm);
             ExifHandling.SetImageModel(imageModel, vm);
             ExifHandling.UpdateExifValues(imageModel, vm);
         });
@@ -341,6 +339,43 @@ public static class NavigationHelper
             await GalleryLoad.ReloadGalleryAsync(vm, fileInfo.DirectoryName);
         }
     }
+    
+    public static void SetSingleImage(Bitmap bitmap, string name, MainViewModel vm)
+    {
+        Dispatcher.UIThread.InvokeAsync(() =>
+        {
+            if (vm.CurrentView != vm.ImageViewer)
+            {
+                vm.CurrentView = vm.ImageViewer;
+            }
+        }, DispatcherPriority.Render);
+
+        vm.ImageIterator = null;
+        vm.ImageSource = bitmap;
+        vm.ImageType = ImageType.Bitmap;
+        var width = bitmap.PixelSize.Width;
+        var height = bitmap.PixelSize.Height;
+
+        if (GalleryFunctions.IsBottomGalleryOpen)
+        {
+            Dispatcher.UIThread.InvokeAsync(() =>
+            {
+                // Trigger animation
+                vm.GalleryMode = GalleryMode.BottomToClosed;
+            });
+            // Set to closed to ensure next gallery mode changing is fired
+            vm.GalleryMode = GalleryMode.Closed;
+        }
+        WindowHelper.SetSize(width, height, vm);
+        if (vm.RotationAngle != 0)
+        {
+            vm.ImageViewer.Rotate(vm.RotationAngle);
+        }
+        var titleString = TitleHelper.TitleString(width, height, name, 1);
+        vm.WindowTitle = titleString[0];
+        vm.Title = titleString[1];
+        vm.TitleTooltip = titleString[1];
+    }
 
 
 }

+ 5 - 0
src/PicView.Avalonia/Navigation/QuickLoad.cs

@@ -4,6 +4,7 @@ using PicView.Avalonia.UI;
 using PicView.Avalonia.ViewModels;
 using PicView.Core.Config;
 using PicView.Core.FileHandling;
+using PicView.Core.ImageDecoding;
 
 namespace PicView.Avalonia.Navigation;
 
@@ -47,6 +48,10 @@ public static class QuickLoad
                 vm.ImageSource = imageModel.Image;
                 vm.ImageType = imageModel.ImageType;
                 WindowHelper.SetSize(imageModel.PixelWidth, imageModel.PixelHeight, imageModel.Rotation, vm);
+                if (vm.RotationAngle != 0)
+                {
+                    vm.ImageViewer.Rotate(vm.RotationAngle);
+                }
                 vm.IsLoading = false;
                 vm.ImageIterator = new ImageIterator(fileInfo, vm);
                 await vm.ImageIterator.AddAsync(vm.ImageIterator.Index, imageModel).ConfigureAwait(false);

+ 1 - 1
src/PicView.Avalonia/UI/WindowHelper.cs

@@ -479,7 +479,7 @@ public static class WindowHelper
             desktopMinWidth,
             desktopMinHeight,
             ImageSizeCalculationHelper.GetInterfaceSize(),
-            0,
+            vm.RotationAngle,
             0,
             screenSize.Scaling,
             vm.TitlebarHeight,

+ 9 - 0
src/PicView.Avalonia/Views/ImageViewer.axaml.cs

@@ -474,6 +474,15 @@ public partial class ImageViewer : UserControl
         WindowHelper.SetSize(vm);
         MainImage.InvalidateVisual();
     }
+    
+    public void Rotate(double angle)
+    {
+        Dispatcher.UIThread.Invoke(() =>
+        {
+            var rotateTransform = new RotateTransform(angle);
+            ImageLayoutTransformControl.LayoutTransform = rotateTransform;
+        });
+    }
 
     public void Flip(bool animate)
     {