From 42c6aa8d565966a9c7af269e1cf1bdc90bb0c9c5 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Mon, 16 Aug 2021 10:35:37 +0200 Subject: [PATCH] Register default ImageSharp configuration for application-wide use --- .../UmbracoBuilder.CoreServices.cs | 2 ++ .../Media/ImageDimensionExtractor.cs | 13 +++++++- .../ImageSharpConfigurationOptions.cs | 30 +++++++++++++++++++ .../UmbracoBuilder.ImageSharp.cs | 10 ++++--- .../Media/ImageSharpImageUrlGenerator.cs | 9 +++--- 5 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/Umbraco.Web.Common/DependencyInjection/ImageSharpConfigurationOptions.cs diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs index d8e3625591..393fb60df4 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs @@ -180,6 +180,8 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddUnique(); + // Add default ImageSharp configuration + builder.Services.AddUnique(SixLabors.ImageSharp.Configuration.Default); builder.Services.AddUnique(); builder.Services.AddUnique(); diff --git a/src/Umbraco.Infrastructure/Media/ImageDimensionExtractor.cs b/src/Umbraco.Infrastructure/Media/ImageDimensionExtractor.cs index f8dc089a0d..380704c26c 100644 --- a/src/Umbraco.Infrastructure/Media/ImageDimensionExtractor.cs +++ b/src/Umbraco.Infrastructure/Media/ImageDimensionExtractor.cs @@ -8,6 +8,17 @@ namespace Umbraco.Cms.Infrastructure.Media { internal class ImageDimensionExtractor : IImageDimensionExtractor { + /// + /// The ImageSharp configuration. + /// + private readonly Configuration _configuration; + + /// + /// Initializes a new instance of the class. + /// + /// The ImageSharp configuration. + public ImageDimensionExtractor(Configuration configuration) => _configuration = configuration; + /// /// Gets the dimensions of an image. /// @@ -39,7 +50,7 @@ namespace Umbraco.Cms.Infrastructure.Media stream.Seek(0, SeekOrigin.Begin); } - using (var image = Image.Load(stream)) + using (var image = Image.Load(_configuration, stream)) { var fileWidth = image.Width; var fileHeight = image.Height; diff --git a/src/Umbraco.Web.Common/DependencyInjection/ImageSharpConfigurationOptions.cs b/src/Umbraco.Web.Common/DependencyInjection/ImageSharpConfigurationOptions.cs new file mode 100644 index 0000000000..86b1dd8a5c --- /dev/null +++ b/src/Umbraco.Web.Common/DependencyInjection/ImageSharpConfigurationOptions.cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.Options; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Web.Middleware; + +namespace Umbraco.Cms.Web.Common.DependencyInjection +{ + /// + /// Configures the ImageSharp middleware options to use the registered configuration. + /// + /// + internal class ImageSharpConfigurationOptions : IConfigureOptions + { + /// + /// The ImageSharp configuration. + /// + private readonly Configuration _configuration; + + /// + /// Initializes a new instance of the class. + /// + /// The ImageSharp configuration. + public ImageSharpConfigurationOptions(Configuration configuration) => _configuration = configuration; + + /// + /// Invoked to configure a instance. + /// + /// The options instance to configure. + public void Configure(ImageSharpMiddlewareOptions options) => options.Configuration = _configuration; + } +} diff --git a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs index df27b5c442..5661fd1487 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs +++ b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs @@ -2,13 +2,16 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using SixLabors.ImageSharp.Web.Caching; using SixLabors.ImageSharp.Web.Commands; using SixLabors.ImageSharp.Web.DependencyInjection; +using SixLabors.ImageSharp.Web.Middleware; using SixLabors.ImageSharp.Web.Processors; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Media; +using Umbraco.Cms.Web.Common.DependencyInjection; using Umbraco.Cms.Web.Common.ImageProcessors; using Umbraco.Cms.Web.Common.Media; @@ -29,6 +32,7 @@ namespace Umbraco.Extensions services.AddImageSharp(options => { + // The configuration is set using ImageSharpConfigurationOptions options.BrowserMaxAge = imagingSettings.Cache.BrowserMaxAge; options.CacheMaxAge = imagingSettings.Cache.CacheMaxAge; options.CachedNameLength = imagingSettings.Cache.CachedNameLength; @@ -52,15 +56,13 @@ namespace Umbraco.Extensions return Task.CompletedTask; }; }) - .Configure(options => - { - options.CacheFolder = imagingSettings.Cache.CacheFolder; - }) + .Configure(options => options.CacheFolder = imagingSettings.Cache.CacheFolder) // We need to add CropWebProcessor before ResizeWebProcessor (until https://github.com/SixLabors/ImageSharp.Web/issues/182 is fixed) .RemoveProcessor() .AddProcessor() .AddProcessor(); + builder.Services.AddTransient, ImageSharpConfigurationOptions>(); builder.Services.AddUnique(); return services; diff --git a/src/Umbraco.Web.Common/Media/ImageSharpImageUrlGenerator.cs b/src/Umbraco.Web.Common/Media/ImageSharpImageUrlGenerator.cs index ead8d3916b..276a3ab492 100644 --- a/src/Umbraco.Web.Common/Media/ImageSharpImageUrlGenerator.cs +++ b/src/Umbraco.Web.Common/Media/ImageSharpImageUrlGenerator.cs @@ -3,8 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; -using Microsoft.Extensions.Options; -using SixLabors.ImageSharp.Web.Middleware; +using SixLabors.ImageSharp; using SixLabors.ImageSharp.Web.Processors; using Umbraco.Cms.Core.Media; using Umbraco.Cms.Core.Models; @@ -24,9 +23,9 @@ namespace Umbraco.Cms.Web.Common.Media /// /// Initializes a new instance of the class. /// - /// The options. - public ImageSharpImageUrlGenerator(IOptions options) - : this(options.Value.Configuration.ImageFormats.SelectMany(f => f.FileExtensions).ToArray()) + /// The ImageSharp configuration. + public ImageSharpImageUrlGenerator(Configuration configuration) + : this(configuration.ImageFormats.SelectMany(f => f.FileExtensions).ToArray()) { } ///