ImageTests.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Net.Mime;
  5. using FluentAssertions;
  6. using NUnit.Framework;
  7. using QuestPDF.Drawing;
  8. using QuestPDF.Elements;
  9. using QuestPDF.Fluent;
  10. using QuestPDF.Helpers;
  11. using QuestPDF.Infrastructure;
  12. using QuestPDF.UnitTests.TestEngine;
  13. using SkiaSharp;
  14. using ImageElement = QuestPDF.Elements.Image;
  15. using DocumentImage = QuestPDF.Infrastructure.Image;
  16. namespace QuestPDF.UnitTests
  17. {
  18. [TestFixture]
  19. public class ImageTests
  20. {
  21. [Test]
  22. public void Measure_TakesAvailableSpaceRegardlessOfSize()
  23. {
  24. TestPlan
  25. .For(x => new ImageElement
  26. {
  27. DocumentImage = GenerateDocumentImage(400, 300)
  28. })
  29. .MeasureElement(new Size(300, 200))
  30. .CheckMeasureResult(SpacePlan.FullRender(300, 200));
  31. }
  32. [Test]
  33. public void Draw_TakesAvailableSpaceRegardlessOfSize()
  34. {
  35. TestPlan
  36. .For(x => new ImageElement
  37. {
  38. CompressionQuality = ImageCompressionQuality.High,
  39. TargetDpi = DocumentSettings.DefaultRasterDpi,
  40. DocumentImage = GenerateDocumentImage(400, 300)
  41. })
  42. .DrawElement(new Size(300, 200))
  43. .ExpectCanvasDrawImage(new Position(0, 0), new Size(300, 200))
  44. .CheckDrawResult();
  45. }
  46. [Test]
  47. public void Fluent_RecognizesImageProportions()
  48. {
  49. var image = GenerateDocumentImage(600, 200);
  50. TestPlan
  51. .For(x =>
  52. {
  53. var container = new Container();
  54. container.Image(image);
  55. return container;
  56. })
  57. .MeasureElement(new Size(300, 200))
  58. .CheckMeasureResult(SpacePlan.FullRender(300, 100));;
  59. }
  60. [Test]
  61. public void UsingSharedImageShouldNotDrasticallyIncreaseDocumentSize()
  62. {
  63. var photo = File.ReadAllBytes("Resources/photo.jpg");
  64. var documentWithSingleImageSize = GetDocumentSize(container =>
  65. {
  66. container.Image(photo);
  67. });
  68. var documentWithMultipleImagesSize = GetDocumentSize(container =>
  69. {
  70. container.Column(column =>
  71. {
  72. foreach (var i in Enumerable.Range(0, 10))
  73. column.Item().Image(photo);
  74. });
  75. });
  76. var documentWithSingleImageUsedMultipleTimesSize = GetDocumentSize(container =>
  77. {
  78. container.Column(column =>
  79. {
  80. var sharedImage = DocumentImage.FromBinaryData(photo);
  81. foreach (var i in Enumerable.Range(0, 10))
  82. column.Item().Image(sharedImage);
  83. });
  84. });
  85. (documentWithMultipleImagesSize / (float)documentWithSingleImageSize).Should().BeInRange(9.9f, 10);
  86. (documentWithSingleImageUsedMultipleTimesSize / (float)documentWithSingleImageSize).Should().BeInRange(1f, 1.05f);
  87. }
  88. [Test]
  89. public void ImageCompressionHasImpactOnDocumentSize()
  90. {
  91. var photo = File.ReadAllBytes("Resources/photo.jpg");
  92. var veryLowCompressionSize = GetDocumentSize(container => container.Image(photo).WithCompressionQuality(ImageCompressionQuality.VeryLow));
  93. var bestCompressionSize = GetDocumentSize(container => container.Image(photo).WithCompressionQuality(ImageCompressionQuality.Best));
  94. (bestCompressionSize / (float)veryLowCompressionSize).Should().BeGreaterThan(25);
  95. }
  96. [Test]
  97. public void TargetDpiHasImpactOnDocumentSize()
  98. {
  99. var photo = File.ReadAllBytes("Resources/photo.jpg");
  100. var lowDpiSize = GetDocumentSize(container => container.Image(photo).WithRasterDpi(12));
  101. var highDpiSize = GetDocumentSize(container => container.Image(photo).WithRasterDpi(144));
  102. (highDpiSize / (float)lowDpiSize).Should().BeGreaterThan(40);
  103. }
  104. private static int GetDocumentSize(Action<IContainer> container)
  105. {
  106. return Document
  107. .Create(document =>
  108. {
  109. document.Page(page =>
  110. {
  111. page.Content().Element(container);
  112. });
  113. })
  114. .GeneratePdf()
  115. .Length;
  116. }
  117. DocumentImage GenerateDocumentImage(int width, int height)
  118. {
  119. var image = Placeholders.Image(width, height);
  120. return DocumentImage.FromBinaryData(image);
  121. }
  122. }
  123. }