more customization when creating thumbnails
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
Reference in New Issue
Block a user