diff --git a/src/ImageSharp/Image.Decode.cs b/src/ImageSharp/Image.Decode.cs index 6b6dc6e21..5330782f2 100644 --- a/src/ImageSharp/Image.Decode.cs +++ b/src/ImageSharp/Image.Decode.cs @@ -101,6 +101,23 @@ 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 decoder and the image format or null if none found. + private static async Task<(IImageDecoder decoder, IImageFormat format)> DiscoverDecoderAsync(Stream stream, Configuration config) + { + IImageFormat format = await InternalDetectFormatAsync(stream, config).ConfigureAwait(false); + + IImageDecoder decoder = format != null + ? config.ImageFormatsManager.FindDecoder(format) + : null; + + return (decoder, format); + } + /// /// Decodes the image stream to the current image. /// @@ -133,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); @@ -157,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); @@ -177,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); } @@ -197,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); }