Browse Source

Resize 'PreviewImage' for big image files to fit max size allowed

Xiphereal 3 years ago
parent
commit
8296ee63aa

+ 7 - 1
PixiEditor/Models/DataHolders/RecentlyOpenedDocument.cs

@@ -102,7 +102,13 @@ namespace PixiEditor.Models.DataHolders
                     corrupt = true;
                 }
 
-                return ImageFileMaxSizeChecker.IsFileUnderMaxSize(bitmap) ? bitmap : null;
+                const int MaxWidthInPixels = 2048;
+                const int MaxHeightInPixels = 2048;
+                ImageFileMaxSizeChecker imageFileMaxSizeChecker = new ImageFileMaxSizeChecker(maxPixelCountAllowed: MaxWidthInPixels * MaxHeightInPixels);
+
+                return imageFileMaxSizeChecker.IsFileUnderMaxSize(bitmap) ?
+                    bitmap
+                    : bitmap.Resize(width: MaxWidthInPixels, height: MaxHeightInPixels, WriteableBitmapExtensions.Interpolation.Bilinear);
             }
 
             return null;

+ 9 - 5
PixiEditor/Models/IO/ImageFileMaxSizeChecker.cs

@@ -2,14 +2,18 @@
 
 namespace PixiEditor.Models.IO
 {
-    internal static class ImageFileMaxSizeChecker
+    internal class ImageFileMaxSizeChecker
     {
-        // Result of 2048 (Width) * 2048 (Height).
-        private const int MaxBitCountAllowed = 4194304;
+        private readonly int maxPixelCountAllowed;
 
-        public static bool IsFileUnderMaxSize(WriteableBitmap fileToCheck)
+        public ImageFileMaxSizeChecker(int maxPixelCountAllowed)
         {
-            return fileToCheck.PixelHeight * fileToCheck.PixelWidth < MaxBitCountAllowed;
+            this.maxPixelCountAllowed = maxPixelCountAllowed;
+        }
+
+        public bool IsFileUnderMaxSize(WriteableBitmap fileToCheck)
+        {
+            return fileToCheck.PixelHeight * fileToCheck.PixelWidth < maxPixelCountAllowed;
         }
     }
 }

+ 6 - 2
PixiEditorTests/ModelsTests/DataHoldersTests/RecentlyOpenedDocumentTests.cs

@@ -33,14 +33,18 @@ namespace PixiEditorTests.ModelsTests.DataHoldersTests
         [InlineData("png")]
         [InlineData("jpg")]
         [InlineData("jpeg")]
-        public void TestThatForBigImageFilesPreviewImageIsNotLoaded(string imageFormat)
+        public void TestThatForBigImageFilesPreviewImageIsResizedToMaxSize(string imageFormat)
         {
             string bigImageFilePath = $@"{Environment.CurrentDirectory}\..\..\..\ModelsTests\IO\BigImage.{imageFormat}";
             RecentlyOpenedDocument recentlyOpenedDocument = new RecentlyOpenedDocument(bigImageFilePath);
 
             var bigImagePreviewImage = recentlyOpenedDocument.PreviewBitmap;
 
-            Assert.Null(bigImagePreviewImage);
+            const int MaxWidthInPixels = 2048;
+            Assert.True(bigImagePreviewImage.PixelWidth <= MaxWidthInPixels);
+
+            const int MaxHeightInPixels = 2048;
+            Assert.True(bigImagePreviewImage.PixelHeight <= MaxHeightInPixels);
         }
 
         [Theory]