From 695dbaffa3682dd987cea57336b3ee28ae38a0e8 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Tue, 2 Apr 2024 16:03:40 +0200 Subject: [PATCH] more customization when creating thumbnails --- zero/Media/MediaCreator.cs | 17 +++++++++++++---- zero/Media/MediaOptions.cs | 16 ++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/zero/Media/MediaCreator.cs b/zero/Media/MediaCreator.cs index 16751620..04c00f02 100644 --- a/zero/Media/MediaCreator.cs +++ b/zero/Media/MediaCreator.cs @@ -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 image = await Image.LoadAsync(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 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); diff --git a/zero/Media/MediaOptions.cs b/zero/Media/MediaOptions.cs index f0a88dc9..a8a74905 100644 --- a/zero/Media/MediaOptions.cs +++ b/zero/Media/MediaOptions.cs @@ -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 AllowedImageFileExtensions { get; set; } - public Dictionary Thumbnails { get; set; } + public Dictionary 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 Mutate { get; set; } } \ No newline at end of file