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; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Web.Common.ImageProcessors; namespace Umbraco.Extensions { public static partial class UmbracoBuilderExtensions { /// /// Adds Image Sharp with Umbraco settings /// public static IServiceCollection AddUmbracoImageSharp(this IUmbracoBuilder builder) { IConfiguration configuration = builder.Config; IServiceCollection services = builder.Services; ImagingSettings 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() .Configure(options => { options.CacheFolder = imagingSettings.Cache.CacheFolder; }) .SetCache() .SetCacheHash() .ClearProcessors() .RemoveProcessor() // The Resize processor is added by default, so remove it to ensure that the crop processor runs first .AddProcessor() .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); } } } } } }