|
@@ -0,0 +1,110 @@
|
|
|
|
|
+using System;
|
|
|
|
|
+using System.IO;
|
|
|
|
|
+using System.Linq;
|
|
|
|
|
+using FluentAssertions;
|
|
|
|
|
+using NUnit.Framework;
|
|
|
|
|
+using QuestPDF.Fluent;
|
|
|
|
|
+using QuestPDF.Helpers;
|
|
|
|
|
+using QuestPDF.Infrastructure;
|
|
|
|
|
+using SkiaSharp;
|
|
|
|
|
+
|
|
|
|
|
+namespace QuestPDF.UnitTests
|
|
|
|
|
+{
|
|
|
|
|
+ public class GenerateImageTests
|
|
|
|
|
+ {
|
|
|
|
|
+ [Test]
|
|
|
|
|
+ [TestCaseSource(nameof(GeneratedImageResolutionCorrespondsToTargetDpi_TestCases))]
|
|
|
|
|
+ public void GeneratedImageResolutionCorrespondsToTargetDpi(GeneratedImageResolutionCorrespondsToTargetDpi_TestCaseItem testCase)
|
|
|
|
|
+ {
|
|
|
|
|
+ // act
|
|
|
|
|
+ var images = Document
|
|
|
|
|
+ .Create(document => document.Page(page =>
|
|
|
|
|
+ {
|
|
|
|
|
+ page.Size(testCase.PageSize);
|
|
|
|
|
+ page.Content().Text("Test");
|
|
|
|
|
+ }))
|
|
|
|
|
+ .GenerateImages(new ImageGenerationSettings { RasterDpi = testCase.TargetDpi });
|
|
|
|
|
+
|
|
|
|
|
+ // assert
|
|
|
|
|
+ images.Should().HaveCount(1);
|
|
|
|
|
+
|
|
|
|
|
+ var imageData = images.First();
|
|
|
|
|
+ imageData.Should().NotBeNull();
|
|
|
|
|
+
|
|
|
|
|
+ using var image = SKImage.FromEncodedData(imageData);
|
|
|
|
|
+ image.Should().NotBeNull();
|
|
|
|
|
+
|
|
|
|
|
+ image.Width.Should().Be(testCase.ExpectedImageSize.Width);
|
|
|
|
|
+ image.Height.Should().Be(testCase.ExpectedImageSize.Height);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public record GeneratedImageResolutionCorrespondsToTargetDpi_TestCaseItem(PageSize PageSize, int TargetDpi, ImageSize ExpectedImageSize);
|
|
|
|
|
+
|
|
|
|
|
+ public static GeneratedImageResolutionCorrespondsToTargetDpi_TestCaseItem[] GeneratedImageResolutionCorrespondsToTargetDpi_TestCases =
|
|
|
|
|
+ {
|
|
|
|
|
+ new(new PageSize(150, 250), 72, new ImageSize(150, 250)),
|
|
|
|
|
+ new(new PageSize(200, 300), 144, new ImageSize(400, 600)),
|
|
|
|
|
+ new(new PageSize(250, 350), 360, new ImageSize(1250, 1750)),
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ [Test]
|
|
|
|
|
+ public void GeneratedImageSizeCorrespondsToImageQuality()
|
|
|
|
|
+ {
|
|
|
|
|
+ // arrange
|
|
|
|
|
+ var document = Document.Create(document => document.Page(page =>
|
|
|
|
|
+ {
|
|
|
|
|
+ page.Content().Image("Resources/photo.jpg");
|
|
|
|
|
+ }));
|
|
|
|
|
+
|
|
|
|
|
+ // act
|
|
|
|
|
+ var imageSizeWithLowQuality = CheckImageSize(ImageCompressionQuality.Low);
|
|
|
|
|
+ var imageSizeWithMediumQuality = CheckImageSize(ImageCompressionQuality.Medium);
|
|
|
|
|
+ var imageSizeWithHighQuality = CheckImageSize(ImageCompressionQuality.High);
|
|
|
|
|
+
|
|
|
|
|
+ // assert
|
|
|
|
|
+ imageSizeWithLowQuality.Should().BeLessThan(imageSizeWithMediumQuality);
|
|
|
|
|
+ imageSizeWithMediumQuality.Should().BeLessThan(imageSizeWithHighQuality);
|
|
|
|
|
+
|
|
|
|
|
+ int CheckImageSize(ImageCompressionQuality quality)
|
|
|
|
|
+ {
|
|
|
|
|
+ var images = document.GenerateImages(new ImageGenerationSettings() { ImageFormat = ImageFormat.Jpeg, ImageCompressionQuality = quality });
|
|
|
|
|
+
|
|
|
|
|
+ images.Should().HaveCount(1);
|
|
|
|
|
+
|
|
|
|
|
+ var image = images.First();
|
|
|
|
|
+ image.Should().NotBeNull();
|
|
|
|
|
+
|
|
|
|
|
+ return image.Length;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ [TestCase(ImageFormat.Png)]
|
|
|
|
|
+ [TestCase(ImageFormat.Jpeg)]
|
|
|
|
|
+ [TestCase(ImageFormat.Webp)]
|
|
|
|
|
+ public void ImageFormatIsRespected(ImageFormat imageFormat)
|
|
|
|
|
+ {
|
|
|
|
|
+ var images = Document
|
|
|
|
|
+ .Create(document =>
|
|
|
|
|
+ {
|
|
|
|
|
+ document.Page(page =>
|
|
|
|
|
+ {
|
|
|
|
|
+ page.Content().Padding(25).AspectRatio(2).Background(Colors.Red.Medium);
|
|
|
|
|
+ });
|
|
|
|
|
+ })
|
|
|
|
|
+ .GenerateImages(new ImageGenerationSettings() { ImageFormat = imageFormat });
|
|
|
|
|
+
|
|
|
|
|
+ images.Should().HaveCount(1);
|
|
|
|
|
+
|
|
|
|
|
+ var imageData = images.First();
|
|
|
|
|
+ imageData.Should().NotBeNull();
|
|
|
|
|
+
|
|
|
|
|
+ using var imageStream = new MemoryStream(imageData);
|
|
|
|
|
+ using var imageCodec = SKCodec.Create(imageStream);
|
|
|
|
|
+
|
|
|
|
|
+ imageCodec.EncodedFormat.ToString().Should().Be(imageFormat.ToString());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|