ImageExamples.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using System.IO;
  2. using System.Linq;
  3. using NUnit.Framework;
  4. using QuestPDF.Drawing.Exceptions;
  5. using QuestPDF.Examples.Engine;
  6. using QuestPDF.Fluent;
  7. using QuestPDF.Helpers;
  8. using QuestPDF.Infrastructure;
  9. using SkiaSharp;
  10. namespace QuestPDF.Examples
  11. {
  12. public class ImageExamples
  13. {
  14. [Test]
  15. public void LoadingImage()
  16. {
  17. RenderingTest
  18. .Create()
  19. .PageSize(PageSizes.A5)
  20. .ProducePdf()
  21. .ShowResults()
  22. .Render(page =>
  23. {
  24. page.Padding(25).Column(column =>
  25. {
  26. column.Spacing(25);
  27. column.Item().Image("logo.png");
  28. var binaryData = File.ReadAllBytes("logo.png");
  29. column.Item().Image(binaryData);
  30. using var stream = new FileStream("logo.png", FileMode.Open);
  31. column.Item().Image(stream);
  32. });
  33. });
  34. }
  35. [Test]
  36. public void DynamicImage()
  37. {
  38. RenderingTest
  39. .Create()
  40. .PageSize(450, 350)
  41. .ProducePdf()
  42. .ShowResults()
  43. .Render(page =>
  44. {
  45. page.Padding(25)
  46. .Image(Placeholders.Image);
  47. });
  48. }
  49. [Test]
  50. public void ScalingImageWithAlpha()
  51. {
  52. RenderingTest
  53. .Create()
  54. .PageSize(PageSizes.A4)
  55. .ProducePdf()
  56. .ShowResults()
  57. .Render(page =>
  58. {
  59. page.Padding(25).Layers(layers =>
  60. {
  61. layers.Layer().Image(Placeholders.Image);
  62. layers.PrimaryLayer().Padding(25).Image("multilingual.png");
  63. });
  64. });
  65. }
  66. [Test]
  67. public void DpiSetting()
  68. {
  69. RenderingTest
  70. .Create()
  71. .PageSize(400, 600)
  72. .ProduceImages()
  73. .ShowResults()
  74. .Render(page =>
  75. {
  76. page.Padding(15).Column(column =>
  77. {
  78. column.Spacing(15);
  79. column.Item().Image("photo.jpg").WithRasterDpi(16).FitUnproportionally();
  80. column.Item().Image("photo.jpg").WithRasterDpi(72);
  81. });
  82. });
  83. }
  84. [Test]
  85. public void CompressionSetting()
  86. {
  87. RenderingTest
  88. .Create()
  89. .PageSize(400, 600)
  90. .ProduceImages()
  91. .ShowResults()
  92. .Render(page =>
  93. {
  94. page.Padding(15).Column(column =>
  95. {
  96. column.Spacing(15);
  97. column.Item().Image("photo.jpg").WithCompressionQuality(ImageCompressionQuality.VeryLow).WithRasterDpi(72);
  98. column.Item().Image("photo.jpg").WithCompressionQuality(ImageCompressionQuality.High).WithRasterDpi(72);
  99. });
  100. });
  101. }
  102. [Test]
  103. public void ReusingImage_With()
  104. {
  105. RenderingTest
  106. .Create()
  107. .PageSize(400, 600)
  108. .ProduceImages()
  109. .ShowResults()
  110. .Render(page =>
  111. {
  112. page.Padding(15).Column(column =>
  113. {
  114. column.Spacing(15);
  115. var image = Image.FromFile("checkbox.png");
  116. foreach (var i in Enumerable.Range(0, 5))
  117. {
  118. column.Item().Row(row =>
  119. {
  120. row.AutoItem().Width(24).Image(image);
  121. row.RelativeItem().PaddingLeft(8).AlignMiddle().Text(Placeholders.Label()).FontSize(16);
  122. });
  123. }
  124. });
  125. });
  126. }
  127. [Test]
  128. public void FitUnproportionally()
  129. {
  130. RenderingTest
  131. .Create()
  132. .PageSize(400, 600)
  133. .ProduceImages()
  134. .ShowResults()
  135. .Render(page =>
  136. {
  137. page.Padding(15).MinimalBox().Background(Colors.Grey.Lighten3).Row(row =>
  138. {
  139. row.RelativeItem().Padding(5).Text(Placeholders.LoremIpsum());
  140. row.RelativeItem().Image("photo.jpg").FitUnproportionally();
  141. });
  142. });
  143. }
  144. [Test]
  145. public void Exception()
  146. {
  147. Assert.Throws<DocumentComposeException>(() =>
  148. {
  149. RenderingTest
  150. .Create()
  151. .PageSize(PageSizes.A2)
  152. .ProducePdf()
  153. .ShowResults()
  154. .Render(page => page.Image("non_existent.png"));
  155. });
  156. }
  157. [Test]
  158. public void DrawingImageWithTransparency()
  159. {
  160. RenderingTest
  161. .Create()
  162. .PageSize(PageSizes.A4)
  163. .ProducePdf()
  164. .ShowResults()
  165. .RenderDocument(document =>
  166. {
  167. document.Page(page =>
  168. {
  169. page.Content()
  170. .AlignCenter()
  171. .Text("Test")
  172. .FontSize(192)
  173. .FontColor(Colors.Blue.Medium)
  174. .Bold();
  175. var image = LoadImageWithTransparency("photo.jpg", 0.75f);
  176. page.Foreground().Image(image);
  177. });
  178. });
  179. QuestPDF.Infrastructure.Image LoadImageWithTransparency(string fileName, float transparency)
  180. {
  181. using var originalImage = SKImage.FromEncodedData(fileName);
  182. using var surface = SKSurface.Create(originalImage.Width, originalImage.Height, SKColorType.Rgba8888, SKAlphaType.Premul);
  183. using var canvas = surface.Canvas;
  184. using var transparencyPaint = new SKPaint
  185. {
  186. ColorFilter = SKColorFilter.CreateBlendMode(SKColors.White.WithAlpha((byte)(transparency * 255)), SKBlendMode.DstIn)
  187. };
  188. canvas.DrawImage(originalImage, new SKPoint(0, 0), transparencyPaint);
  189. var encodedImage = surface.Snapshot().Encode(SKEncodedImageFormat.Png, 100).ToArray();
  190. return Image.FromBinaryData(encodedImage);
  191. }
  192. }
  193. }
  194. }