ImageTests.cs 4.8 KB

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