DPI-based image scaling prototype (not ready for production)

This commit is contained in:
MarcinZiabek
2023-04-22 09:30:46 +02:00
parent 1c9bccbeb2
commit 8a358a8fa2
6 changed files with 84 additions and 2 deletions
@@ -0,0 +1,22 @@
using System;
using System.Diagnostics;
using System.IO;
using QuestPDF.Fluent;
using QuestPDF.Infrastructure;
namespace QuestPDF.Examples.Engine
{
public static class Helpers
{
public static void GeneratePdfAndOpen(this Document document, string? fileName = null)
{
fileName ??= $"{Guid.NewGuid():D}.pdf";
var filePath = Path.GetTempPath() + fileName;
var documentData = document.GeneratePdf();
File.WriteAllBytes(filePath, documentData);
Process.Start("explorer", filePath);
}
}
}
+24
View File
@@ -89,5 +89,29 @@ namespace QuestPDF.Examples
});
});
}
[Test]
public void ImageResolutionScaling()
{
var image = Image.FromFile("large-image.jpg");
Document
.Create(document =>
{
document.Page(page =>
{
page.Size(11000, 11000);
page.Margin(50);
page.Content().Image(image);
});
})
.GeneratePdfAndOpen();
//Console.WriteLine(documentData.Length);
// var filePath = Path.GetTempPath() + $"test.pdf";
// File.WriteAllBytes(filePath, documentData);
// Console.WriteLine(filePath);
}
}
}
@@ -32,6 +32,12 @@
<None Update="pdf-icon.svg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="large-image.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="large-image.jpg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

+1 -1
View File
@@ -27,7 +27,7 @@ namespace QuestPDF.Elements
if (DocumentImage == null)
return;
Canvas.DrawImage(DocumentImage.SkImage, Position.Zero, availableSpace);
Canvas.DrawImage(DocumentImage.GetVersionOfSize(availableSpace), Position.Zero, availableSpace);
}
}
}
+31 -1
View File
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using QuestPDF.Drawing.Exceptions;
using SkiaSharp;
@@ -7,7 +8,8 @@ namespace QuestPDF.Infrastructure
{
public class Image : IDisposable
{
internal SKImage SkImage { get; }
private SKImage SkImage { get; }
internal List<(Size size, SKImage image)>? ScaledImageCache { get; }
internal bool IsDocumentScoped { get; set; }
public int Width => SkImage.Width;
@@ -27,6 +29,34 @@ namespace QuestPDF.Infrastructure
public void Dispose()
{
SkImage.Dispose();
ScaledImageCache?.ForEach(x => x.image.Dispose());
}
internal SKImage GetVersionOfSize(Size size)
{
if (size.Width > Width || size.Height > Height)
return SkImage;
var target = SKImage.Create(new SKImageInfo((int)size.Width, (int)size.Height));
SkImage.ScalePixels(target.PeekPixels(), SKFilterQuality.High);
return target;
// bool ShouldApplyScaling()
// {
// const float tolerance = 1.1f;
//
// if (width > Width / tolerance || height > Height / tolerance)
// return false;
//
// SkImage.sca
// }
static bool HasSimilarSize(Size a, Size b, float tolerance)
{
return (a.Width / b.Width > 1 / tolerance && a.Width / b.Width < tolerance) ||
(a.Height / b.Height > 1 / tolerance && a.Height / b.Height < tolerance);
}
}
#region public constructors