ImageExamples.cs 7.0 KB

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