Image generation: improved performance and quality
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user