2
0
Эх сурвалжийг харах

Image generation: improved performance and quality

MarcinZiabek 2 жил өмнө
parent
commit
f60aea0f83

+ 8 - 5
Source/QuestPDF/Drawing/DocumentGenerator.cs

@@ -51,7 +51,7 @@ namespace QuestPDF.Drawing
             
             var settings = document.GetSettings();
             var canvas = new ImageCanvas(settings);
-            RenderDocument(canvas, document, settings);
+            RenderDocument(canvas, document, settings, useOriginalImages: true);
 
             return canvas.Images;
         }
@@ -92,7 +92,7 @@ namespace QuestPDF.Drawing
             return canvas.Pictures;
         }
         
-        internal static void RenderDocument<TCanvas>(TCanvas canvas, IDocument document, DocumentSettings settings)
+        internal static void RenderDocument<TCanvas>(TCanvas canvas, IDocument document, DocumentSettings settings, bool useOriginalImages = false)
             where TCanvas : ICanvas, IRenderingCanvas
         {
             var container = new DocumentContainer();
@@ -101,7 +101,7 @@ namespace QuestPDF.Drawing
             
             ApplyInheritedAndGlobalTexStyle(content, TextStyle.Default);
             ApplyContentDirection(content, settings.ContentDirection);
-            ApplyDefaultImageConfiguration(content, settings.ImageRasterDpi, settings.ImageCompressionQuality);
+            ApplyDefaultImageConfiguration(content, settings.ImageRasterDpi, settings.ImageCompressionQuality, useOriginalImages);
             
             var debuggingState = Settings.EnableDebugging ? ApplyDebugging(content) : null;
             
@@ -228,7 +228,7 @@ namespace QuestPDF.Drawing
                 ApplyContentDirection(child, direction);
         }
         
-        internal static void ApplyDefaultImageConfiguration(this Element? content, int imageRasterDpi, ImageCompressionQuality imageCompressionQuality)
+        internal static void ApplyDefaultImageConfiguration(this Element? content, int imageRasterDpi, ImageCompressionQuality imageCompressionQuality, bool useOriginalImages)
         {
             content.VisitChildren(x =>
             {
@@ -236,25 +236,28 @@ namespace QuestPDF.Drawing
                 {
                     image.TargetDpi ??= imageRasterDpi;
                     image.CompressionQuality ??= imageCompressionQuality;
+                    image.UseOriginalImage |= useOriginalImages;
                 }
 
                 if (x is QuestPDF.Elements.DynamicImage dynamicImage)
                 {
                     dynamicImage.TargetDpi ??= imageRasterDpi;
                     dynamicImage.CompressionQuality ??= imageCompressionQuality;
+                    dynamicImage.UseOriginalImage |= useOriginalImages;
                 }
 
                 if (x is DynamicHost dynamicHost)
                 {
                     dynamicHost.ImageTargetDpi ??= imageRasterDpi;
                     dynamicHost.ImageCompressionQuality ??= imageCompressionQuality;
+                    dynamicHost.UseOriginalImage |= useOriginalImages;
                 }
 
                 if (x is TextBlock textBlock)
                 {
                     foreach (var textBlockElement in textBlock.Items.OfType<TextBlockElement>())
                     {
-                        textBlockElement.Element.ApplyDefaultImageConfiguration(imageRasterDpi, imageCompressionQuality);
+                        textBlockElement.Element.ApplyDefaultImageConfiguration(imageRasterDpi, imageCompressionQuality, useOriginalImages);
                     }
                 }
             });

+ 4 - 1
Source/QuestPDF/Elements/Dynamic.cs

@@ -16,6 +16,7 @@ namespace QuestPDF.Elements
         
         internal int? ImageTargetDpi { get; set; }
         internal ImageCompressionQuality? ImageCompressionQuality { get; set; }
+        internal bool UseOriginalImage { get; set; }
         
         public DynamicHost(DynamicComponentProxy child)
         {
@@ -63,6 +64,7 @@ namespace QuestPDF.Elements
                 
                 ImageTargetDpi = ImageTargetDpi.Value,
                 ImageCompressionQuality = ImageCompressionQuality.Value,
+                UseOriginalImage = UseOriginalImage,
                 
                 PageNumber = PageContext.CurrentPage,
                 TotalPages = PageContext.GetLocation(Infrastructure.PageContext.DocumentLocation).PageEnd,
@@ -88,6 +90,7 @@ namespace QuestPDF.Elements
 
         internal int ImageTargetDpi { get; set; }
         internal ImageCompressionQuality ImageCompressionQuality { get; set; }
+        internal bool UseOriginalImage { get; set; }
         
         public int PageNumber { get; internal set; }
         public int TotalPages { get; internal set; }
@@ -100,7 +103,7 @@ namespace QuestPDF.Elements
             
             container.ApplyInheritedAndGlobalTexStyle(TextStyle);
             container.ApplyContentDirection(ContentDirection);
-            container.ApplyDefaultImageConfiguration(ImageTargetDpi, ImageCompressionQuality);
+            container.ApplyDefaultImageConfiguration(ImageTargetDpi, ImageCompressionQuality, UseOriginalImage);
             
             container.InjectDependencies(PageContext, Canvas);
             container.VisitChildren(x => (x as IStateResettable)?.ResetState());

+ 8 - 0
Source/QuestPDF/Elements/DynamicImage.cs

@@ -13,6 +13,7 @@ namespace QuestPDF.Elements
     {
         internal int? TargetDpi { get; set; }
         internal ImageCompressionQuality? CompressionQuality { get; set; }
+        internal bool UseOriginalImage { get; set; }
         public GenerateDynamicImageDelegate? Source { get; set; }
         
         internal override SpacePlan Measure(Size availableSpace)
@@ -31,6 +32,13 @@ namespace QuestPDF.Elements
                 return;
 
             using var originalImage = SKImage.FromEncodedData(imageData);
+            
+            if (UseOriginalImage)
+            {
+                Canvas.DrawImage(originalImage, Position.Zero, availableSpace);
+                return;
+            }
+            
             using var compressedImage = originalImage.CompressImage(CompressionQuality.Value);
 
             var targetImage = Helpers.Helpers.GetImageWithSmallerSize(originalImage, compressedImage);