From 99fb1c4fb7e030fb0200711e6287b15fb5fb0ce5 Mon Sep 17 00:00:00 2001 From: pekspro Date: Sun, 5 Jul 2020 07:23:18 +0200 Subject: [PATCH 1/2] Adds DiscoverDecoderAsync. --- src/ImageSharp/Image.Decode.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ImageSharp/Image.Decode.cs b/src/ImageSharp/Image.Decode.cs index 6b6dc6e21..1dededae4 100644 --- a/src/ImageSharp/Image.Decode.cs +++ b/src/ImageSharp/Image.Decode.cs @@ -101,6 +101,22 @@ namespace SixLabors.ImageSharp : null; } + /// + /// By reading the header on the provided stream this calculates the images format. + /// + /// The image stream to read the header from. + /// The configuration. + /// The IImageFormat. + /// The image format or null if none found. + private static async Task DiscoverDecoderAsync(Stream stream, Configuration config, out IImageFormat format) + { + format = await InternalDetectFormatAsync(stream, config).ConfigureAwait(false); + + return format != null + ? config.ImageFormatsManager.FindDecoder(format) + : null; + } + /// /// Decodes the image stream to the current image. /// From b4c21c4299e14e48037c82c0160244ab4141d466 Mon Sep 17 00:00:00 2001 From: pekspro Date: Mon, 6 Jul 2020 19:15:32 +0200 Subject: [PATCH 2/2] Adds DiscoverDecoderAsync and starts using it. --- src/ImageSharp/Image.Decode.cs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/ImageSharp/Image.Decode.cs b/src/ImageSharp/Image.Decode.cs index 1dededae4..5330782f2 100644 --- a/src/ImageSharp/Image.Decode.cs +++ b/src/ImageSharp/Image.Decode.cs @@ -106,15 +106,16 @@ namespace SixLabors.ImageSharp /// /// The image stream to read the header from. /// The configuration. - /// The IImageFormat. - /// The image format or null if none found. - private static async Task DiscoverDecoderAsync(Stream stream, Configuration config, out IImageFormat format) + /// The decoder and the image format or null if none found. + private static async Task<(IImageDecoder decoder, IImageFormat format)> DiscoverDecoderAsync(Stream stream, Configuration config) { - format = await InternalDetectFormatAsync(stream, config).ConfigureAwait(false); + IImageFormat format = await InternalDetectFormatAsync(stream, config).ConfigureAwait(false); - return format != null + IImageDecoder decoder = format != null ? config.ImageFormatsManager.FindDecoder(format) : null; + + return (decoder, format); } /// @@ -149,7 +150,7 @@ namespace SixLabors.ImageSharp private static async Task<(Image Image, IImageFormat Format)> DecodeAsync(Stream stream, Configuration config) where TPixel : unmanaged, IPixel { - IImageDecoder decoder = DiscoverDecoder(stream, config, out IImageFormat format); + (IImageDecoder decoder, IImageFormat format) = await DiscoverDecoderAsync(stream, config).ConfigureAwait(false); if (decoder is null) { return (null, null); @@ -173,7 +174,7 @@ namespace SixLabors.ImageSharp private static async Task<(Image Image, IImageFormat Format)> DecodeAsync(Stream stream, Configuration config) { - IImageDecoder decoder = DiscoverDecoder(stream, config, out IImageFormat format); + (IImageDecoder decoder, IImageFormat format) = await DiscoverDecoderAsync(stream, config).ConfigureAwait(false); if (decoder is null) { return (null, null); @@ -193,7 +194,9 @@ namespace SixLabors.ImageSharp /// private static (IImageInfo ImageInfo, IImageFormat Format) InternalIdentity(Stream stream, Configuration config) { - if (!(DiscoverDecoder(stream, config, out IImageFormat format) is IImageInfoDetector detector)) + IImageDecoder decoder = DiscoverDecoder(stream, config, out IImageFormat format); + + if (!(decoder is IImageInfoDetector detector)) { return (null, null); } @@ -213,7 +216,9 @@ namespace SixLabors.ImageSharp /// is not found. private static async Task<(IImageInfo ImageInfo, IImageFormat Format)> InternalIdentityAsync(Stream stream, Configuration config) { - if (!(DiscoverDecoder(stream, config, out IImageFormat format) is IImageInfoDetector detector)) + (IImageDecoder decoder, IImageFormat format) = await DiscoverDecoderAsync(stream, config).ConfigureAwait(false); + + if (!(decoder is IImageInfoDetector detector)) { return (null, null); }