Skip to content

Commit 0d32154

Browse files
committed
Added placeholder loader
1 parent 04f7fd2 commit 0d32154

File tree

6 files changed

+131
-1
lines changed

6 files changed

+131
-1
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) usercode
2+
// https://github.com/usercode/ImageWizard
3+
// MIT License
4+
5+
namespace ImageWizard.Client;
6+
7+
/// <summary>
8+
/// OpenGraphExtensions
9+
/// </summary>
10+
public static class PlaceholderExtensions
11+
{
12+
public static Image Placeholder(this ILoader imageUrlBuilder, int width, int height)
13+
{
14+
return new Image(imageUrlBuilder.LoadData("placeholder", $"{width}x{height}"));
15+
}
16+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) usercode
2+
// https://github.com/usercode/ImageWizard
3+
// MIT License
4+
5+
using Microsoft.Extensions.DependencyInjection;
6+
7+
namespace ImageWizard.ImageSharp;
8+
9+
public static class PalceholderExtensions
10+
{
11+
public static IImageWizardBuilder AddPlaceholder(this IImageWizardBuilder wizardConfiguration, Action<PlaceholderOptions>? options = null)
12+
{
13+
if (options != null)
14+
{
15+
wizardConfiguration.Services.Configure(options);
16+
}
17+
18+
wizardConfiguration.Services.AddTransient<PlaceholderLoader>();
19+
wizardConfiguration.LoaderManager.Register<PlaceholderLoader>("placeholder");
20+
21+
return wizardConfiguration;
22+
}
23+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright (c) usercode
2+
// https://github.com/usercode/ImageWizard
3+
// MIT License
4+
5+
using ImageWizard.Loaders;
6+
using Microsoft.Extensions.Options;
7+
using SixLabors.Fonts;
8+
using SixLabors.ImageSharp;
9+
using SixLabors.ImageSharp.Drawing.Processing;
10+
using SixLabors.ImageSharp.PixelFormats;
11+
using SixLabors.ImageSharp.Processing;
12+
using System.Text.RegularExpressions;
13+
14+
namespace ImageWizard.ImageSharp;
15+
16+
public partial class PlaceholderLoader : Loader<PlaceholderOptions>
17+
{
18+
public PlaceholderLoader(IOptions<PlaceholderOptions> options)
19+
: base(options)
20+
{
21+
}
22+
23+
[GeneratedRegex("^(?<width>[0-9]+)x(?<height>[0-9]+)$")]
24+
private partial Regex RegexSource();
25+
26+
public override async Task<LoaderResult> GetAsync(string source, ICachedData? existingCachedData)
27+
{
28+
Match match = RegexSource().Match(source);
29+
30+
if (match.Success == false)
31+
{
32+
return LoaderResult.Failed();
33+
}
34+
35+
int width = int.Parse(match.Groups["width"].Value);
36+
int height = int.Parse(match.Groups["height"].Value);
37+
38+
Image image = new Image<Rgba32>(width, height, Rgba32.ParseHex(Options.Value.BackgroundColor));
39+
40+
string text = $"{width}x{height}";
41+
42+
var font = SystemFonts.Get(Options.Value.FontName).CreateFont(Options.Value.FontSize, FontStyle.Regular);
43+
var textOptions = new TextOptions(font) { Dpi = 72, KerningMode = KerningMode.Standard };
44+
var rect = TextMeasurer.MeasureSize(text, textOptions);
45+
46+
image.Mutate(x => x.DrawText(
47+
$"{image.Width} x {image.Height}",
48+
font,
49+
new Color(Rgba32.ParseHex(Options.Value.FontColor)),
50+
new PointF((image.Width / 2) - (rect.Width / 2), (image.Height / 2) - (rect.Height / 2) )));
51+
52+
MemoryStream mem = new MemoryStream();
53+
54+
await image.SaveAsPngAsync(mem);
55+
56+
mem.Seek(0, SeekOrigin.Begin);
57+
58+
return LoaderResult.Success(new OriginalData(MimeTypes.Png, mem));
59+
}
60+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) usercode
2+
// https://github.com/usercode/ImageWizard
3+
// MIT License
4+
5+
using ImageWizard.Loaders;
6+
7+
namespace ImageWizard.ImageSharp;
8+
9+
public class PlaceholderOptions : LoaderOptions
10+
{
11+
public string BackgroundColor { get; set; } = "#4682b4";
12+
13+
public string FontColor { get; set; } = "#FFFFFF";
14+
15+
public string FontName { get; set; } = "Arial";
16+
17+
public float FontSize { get; set; } = 32;
18+
19+
}

src/ImageWizard.TestApp/Pages/Index.cshtml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,17 @@
193193
</div>
194194
</div>
195195

196+
<h2>Placeholder</h2>
197+
<p>@@Url.ImageWizard().Placeholder(600, 300).BuildUrl()</p>
198+
<p>@Url.ImageWizard().Placeholder(600, 300).BuildUrl()</p>
199+
200+
<div class="row">
201+
<div class="col">
202+
<img src="@Url.ImageWizard().Placeholder(600, 300).BuildUrl()" />
203+
<p>600x300</p>
204+
</div>
205+
</div>
206+
196207
<h2>DPR (Device Pixel Ratio)</h2>
197208

198209
<p>@@Url.ImageWizard().Fetch("lion.jpg").AsImage().DPR(1).Resize(100,100).BuildUrl()</p>
@@ -261,7 +272,7 @@
261272
</div>
262273
</div>
263274

264-
<h2>Use youtube taghelper (DSGVO friendly)</h2>
275+
<h2>Use youtube taghelper (GDPR friendly)</h2>
265276

266277
<div class="alert alert-secondary">
267278
@("<youtube video-id=\"AQHZQ8p6FCA\" width=\"1920\" height=\"1080\" grayscale=\"true\" blur=\"true\" use-no-cookie=\"true\" />")

src/ImageWizard.TestApp/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
.AddPuppeteerLoader(x => x.RefreshMode = LoaderRefreshMode.None)
120120
//.AddPlaywrightLoader(x => x.RefreshMode = LoaderRefreshMode.None)
121121
.AddOpenGraphLoader(x => x.RefreshMode = LoaderRefreshMode.None)
122+
.AddPlaceholder(x => x.RefreshMode = LoaderRefreshMode.None)
122123
.AddFFMpegCore()
123124
.AddDocNET()
124125
.AddOpenCvSharp()

0 commit comments

Comments
 (0)