using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Web.Caching; using SixLabors.ImageSharp.Web.Commands; using SixLabors.ImageSharp.Web.DependencyInjection; using SixLabors.ImageSharp.Web.Processors; using SixLabors.ImageSharp.Web.Providers; using Umbraco.Cms.Core.Configuration.Models; namespace Umbraco.Extensions { public static class ServiceCollectionExtensions { /// /// Adds Image Sharp with Umbraco settings /// public static IServiceCollection AddUmbracoImageSharp(this IServiceCollection services, IConfiguration configuration) { var imagingSettings = configuration.GetSection(Cms.Core.Constants.Configuration.ConfigImaging) .Get() ?? new ImagingSettings(); services.AddImageSharp(options => { options.Configuration = SixLabors.ImageSharp.Configuration.Default; options.BrowserMaxAge = imagingSettings.Cache.BrowserMaxAge; options.CacheMaxAge = imagingSettings.Cache.CacheMaxAge; options.CachedNameLength = imagingSettings.Cache.CachedNameLength; options.OnParseCommandsAsync = context => { RemoveIntParamenterIfValueGreatherThen(context.Commands, ResizeWebProcessor.Width, imagingSettings.Resize.MaxWidth); RemoveIntParamenterIfValueGreatherThen(context.Commands, ResizeWebProcessor.Height, imagingSettings.Resize.MaxHeight); return Task.CompletedTask; }; options.OnBeforeSaveAsync = _ => Task.CompletedTask; options.OnProcessedAsync = _ => Task.CompletedTask; options.OnPrepareResponseAsync = _ => Task.CompletedTask; }) .SetRequestParser() .SetMemoryAllocator(provider => ArrayPoolMemoryAllocator.CreateWithMinimalPooling()) .Configure(options => { options.CacheFolder = imagingSettings.Cache.CacheFolder; }) .SetCache() .SetCacheHash() .AddProvider() .AddProcessor() .AddProcessor() .AddProcessor(); return services; } private static void RemoveIntParamenterIfValueGreatherThen(IDictionary commands, string parameter, int maxValue) { if (commands.TryGetValue(parameter, out var command)) { if (int.TryParse(command, out var i)) { if (i > maxValue) { commands.Remove(parameter); } } } } } }