Browse Source

Disabled JPEG image downscaling for highest quality levels

Marcin Ziąbek 1 year ago
parent
commit
62118791ca
2 changed files with 19 additions and 5 deletions
  1. 16 2
      Source/QuestPDF/Helpers/Helpers.cs
  2. 3 3
      Source/QuestPDF/Skia/SkImage.cs

+ 16 - 2
Source/QuestPDF/Helpers/Helpers.cs

@@ -80,14 +80,28 @@ namespace QuestPDF.Helpers
             };
         }
         
+        internal static bool ToDownsamplingStrategy(this ImageCompressionQuality quality)
+        {
+            return quality switch
+            {
+                ImageCompressionQuality.Best => false,
+                ImageCompressionQuality.VeryHigh => false,
+                ImageCompressionQuality.High => true,
+                ImageCompressionQuality.Medium => true,
+                ImageCompressionQuality.Low => true,
+                ImageCompressionQuality.VeryLow => true,
+                _ => throw new ArgumentOutOfRangeException(nameof(quality), quality, null)
+            };
+        }
+        
         internal static SkImage CompressImage(this SkImage image, ImageCompressionQuality compressionQuality)
         {
-            return image.ResizeAndCompress(image.Width, image.Height, compressionQuality.ToQualityValue());
+            return image.ResizeAndCompress(image.Width, image.Height, compressionQuality.ToQualityValue(), compressionQuality.ToDownsamplingStrategy());
         }
 
         internal static SkImage ResizeAndCompressImage(this SkImage image, ImageSize targetResolution, ImageCompressionQuality compressionQuality)
         {
-            return image.ResizeAndCompress(targetResolution.Width, targetResolution.Height, compressionQuality.ToQualityValue());
+            return image.ResizeAndCompress(targetResolution.Width, targetResolution.Height, compressionQuality.ToQualityValue(), compressionQuality.ToDownsamplingStrategy());
         }
 
         internal static SkImage GetImageWithSmallerSize(SkImage one, SkImage second)

+ 3 - 3
Source/QuestPDF/Skia/SkImage.cs

@@ -39,9 +39,9 @@ internal sealed class SkImage : IDisposable
     /// When image is opaque, uses the JPEG compression algorithm, otherwise uses the PNG algorithm.
     /// Only the JPEG compression algorithm uses the compressionQuality parameter.
     /// </summary>
-    public SkImage ResizeAndCompress(int targetWidth, int targetHeight, int compressionQuality)
+    public SkImage ResizeAndCompress(int targetWidth, int targetHeight, int compressionQuality, bool downsample)
     {
-        var instance = API.image_resize_and_compress(Instance, targetWidth, targetHeight, compressionQuality);
+        var instance = API.image_resize_and_compress(Instance, targetWidth, targetHeight, compressionQuality, downsample);
         return new SkImage(instance);
     }
     
@@ -80,7 +80,7 @@ internal sealed class SkImage : IDisposable
         public static extern void image_unref(IntPtr image);
         
         [DllImport(SkiaAPI.LibraryName, CallingConvention = CallingConvention.Cdecl)]
-        public static extern IntPtr image_resize_and_compress(IntPtr image, int targetImageWidth, int targetImageHeight, int compressionQuality);
+        public static extern IntPtr image_resize_and_compress(IntPtr image, int targetImageWidth, int targetImageHeight, int compressionQuality, bool downsample);
 
         [StructLayout(LayoutKind.Sequential)]
         public struct SkImageDetails