ImageTests.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. DocumentImage = GenerateDocumentImage(400, 300)
  39. })
  40. .DrawElement(new Size(300, 200))
  41. .ExpectCanvasDrawImage(new Position(0, 0), new Size(300, 200))
  42. .CheckDrawResult();
  43. }
  44. [Test]
  45. public void Fluent_RecognizesImageProportions()
  46. {
  47. var image = GenerateSkiaImage(600, 200).Encode(SKEncodedImageFormat.Png, 100).ToArray();
  48. TestPlan
  49. .For(x =>
  50. {
  51. var container = new Container();
  52. container.Image(image);
  53. return container;
  54. })
  55. .MeasureElement(new Size(300, 200))
  56. .CheckMeasureResult(SpacePlan.FullRender(300, 100));;
  57. }
  58. [Test]
  59. public void UsingSharedImageShouldNotDrasticallyIncreaseDocumentSize()
  60. {
  61. var photo = File.ReadAllBytes("Resources/photo.jpg");
  62. var documentWithSingleImageSize = GetDocumentSize(container =>
  63. {
  64. container.Image(photo);
  65. });
  66. var documentWithMultipleImagesSize = GetDocumentSize(container =>
  67. {
  68. container.Column(column =>
  69. {
  70. foreach (var i in Enumerable.Range(0, 10))
  71. column.Item().Image(photo);
  72. });
  73. });
  74. var documentWithSingleImageUsedMultipleTimesSize = GetDocumentSize(container =>
  75. {
  76. container.Column(column =>
  77. {
  78. var sharedImage = DocumentImage.FromBinaryData(photo).DisposeAfterDocumentGeneration();
  79. foreach (var i in Enumerable.Range(0, 10))
  80. column.Item().Image(sharedImage);
  81. });
  82. });
  83. (documentWithMultipleImagesSize / (float)documentWithSingleImageSize).Should().BeInRange(9.9f, 10);
  84. (documentWithSingleImageUsedMultipleTimesSize / (float)documentWithSingleImageSize).Should().BeInRange(1f, 1.05f);
  85. }
  86. private static int GetDocumentSize(Action<IContainer> container)
  87. {
  88. return Document
  89. .Create(document =>
  90. {
  91. document.Page(page =>
  92. {
  93. page.Content().Element(container);
  94. });
  95. })
  96. .GeneratePdf()
  97. .Length;
  98. }
  99. SKImage GenerateSkiaImage(int width, int height)
  100. {
  101. var imageInfo = new SKImageInfo(width, height);
  102. using var surface = SKSurface.Create(imageInfo);
  103. return surface.Snapshot();
  104. }
  105. DocumentImage GenerateDocumentImage(int width, int height)
  106. {
  107. var skiaImage = GenerateSkiaImage(width, height);
  108. return DocumentImage.FromSkImage(skiaImage);
  109. }
  110. }
  111. }