more customization when creating thumbnails

This commit is contained in:
2024-04-02 16:03:40 +02:00
parent c759fcb1a7
commit 695dbaffa3
2 changed files with 27 additions and 6 deletions
+13 -4
View File
@@ -1,6 +1,9 @@
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Formats.Webp;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
@@ -61,6 +64,7 @@ public class MediaCreator : IMediaCreator
if (isImage)
{
// load image to create thumbnails
using Image<Rgba32> image = await Image.LoadAsync<Rgba32>(fileInfo.AbsolutePath, cancellationToken);
model.Metadata = GetImageMetadata(image.Metadata, image.Size);
@@ -68,17 +72,22 @@ public class MediaCreator : IMediaCreator
if (Options.Thumbnails != null)
{
foreach ((string key, ResizeOptions opts) in Options.Thumbnails)
foreach ((string key, ThumbnailOptions opts) in Options.Thumbnails)
{
Image<Rgba32> imageFrame = image.Frames.Count > 1 ? image.Frames.CloneFrame(0) : image.Clone();
imageFrame.Mutate(x => x.Resize(opts));
IImageEncoder encoder = opts.Encoder ?? new WebpEncoder();
if (opts.Mutate != null)
{
imageFrame.Mutate(opts.Mutate);
}
using MemoryStream stream = new();
await imageFrame.SaveAsync(stream, new PngEncoder(), cancellationToken);
await imageFrame.SaveAsync(stream, encoder, cancellationToken);
stream.Position = 0;
string thumbFilename = normalizedFilename.TrimEnd(extension) + "." + Safenames.File(key) + ".png";
string thumbFilename = normalizedFilename.TrimEnd(extension) + "." + Safenames.File(key) + opts.Extension.Or(".webp");
string path = directory + '/' + thumbFilename;
await FileSystem.CreateFile(path, stream, cancellationToken: cancellationToken);
+14 -2
View File
@@ -1,4 +1,6 @@
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Web.Caching;
namespace zero.Media;
@@ -13,7 +15,7 @@ public class MediaOptions
public List<string> AllowedImageFileExtensions { get; set; }
public Dictionary<string, ResizeOptions> Thumbnails { get; set; }
public Dictionary<string, ThumbnailOptions> Thumbnails { get; set; }
public ImageSharpOptions ImageSharp { get; set; } = new();
}
@@ -40,4 +42,14 @@ public class ImagingSharpRemoteCacheOptions
public string MediaFolder { get; set; } = "/media/_remote/";
public string KeyMapFile { get; set; } = "/Config/remotekeys.json";
}
public class ThumbnailOptions
{
public string Extension { get; set; }
public IImageEncoder Encoder { get; set; }
public Action<IImageProcessingContext> Mutate { get; set; }
}