diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs index efdb497a52..970ae628a9 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpCompressOptions.cs @@ -1,11 +1,30 @@ -using SixLabors.ImageSharp.Formats.Png; +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.Formats.Jpeg; +using SixLabors.ImageSharp.Formats.Png; +using SixLabors.ImageSharp.Formats.Webp; namespace Volo.Abp.Imaging; public class ImageSharpCompressOptions { - public int JpegQuality { get; set; } = 60; - public PngCompressionLevel PngCompressionLevel { get; set; } = PngCompressionLevel.BestCompression; - public bool PngIgnoreMetadata { get; set; } = true; - public int WebpQuality { get; set; } = 60; + public IImageEncoder JpegEncoder { get; set; } + + public IImageEncoder PngEncoder { get; set; } + + public IImageEncoder WebpEncoder { get; set; } + + public int DefaultQuality { get; set; } = 75; + public ImageSharpCompressOptions() + { + JpegEncoder = new JpegEncoder() { + Quality = DefaultQuality + }; + PngEncoder = new PngEncoder() { + CompressionLevel = PngCompressionLevel.BestCompression, + IgnoreMetadata = true + }; + WebpEncoder = new WebpEncoder() { + Quality = DefaultQuality + }; + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs index c80f64713e..57eb984412 100644 --- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs +++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs @@ -3,7 +3,9 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Options; +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; @@ -34,28 +36,26 @@ public class ImageSharpImageCompressorContributor : IImageCompressorContributor, try { var (image, format) = await SixLabors.ImageSharp.Image.LoadWithFormatAsync(stream, cancellationToken); - + var beforeSize = stream.Length; mimeType = format.DefaultMimeType; if (!CanCompress(mimeType)) { return new ImageContributorResult(stream, false, false); } + + IImageEncoder encoder = null; - var encoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(format); - - switch (encoder) + switch (format.DefaultMimeType) { - case JpegEncoder jpegEncoder: - jpegEncoder.Quality = Options.JpegQuality; + case MimeTypes.Image.Jpeg: + encoder = Options.JpegEncoder ?? new JpegEncoder(); break; - case PngEncoder pngEncoder: - pngEncoder.CompressionLevel = Options.PngCompressionLevel; - pngEncoder.IgnoreMetadata = Options.PngIgnoreMetadata; + case MimeTypes.Image.Png: + encoder = Options.PngEncoder ?? new PngEncoder(); break; - case WebpEncoder webPEncoder: - webPEncoder.Quality = Options.WebpQuality; - webPEncoder.UseAlphaCompression = true; + case MimeTypes.Image.Webp: + encoder = Options.WebpEncoder ?? new WebpEncoder(); break; case null: throw new NotSupportedException($"No encoder available for the given format: {format.Name}"); @@ -63,6 +63,14 @@ public class ImageSharpImageCompressorContributor : IImageCompressorContributor, ms = new MemoryStream(); await image.SaveAsync(ms, encoder, cancellationToken: cancellationToken); + + var afterSize = ms.Length; + + if (afterSize >= beforeSize) + { + ms.Dispose(); + return new ImageContributorResult(stream, false); + } ms.Position = 0; return new ImageContributorResult(ms, true);