59 lines
2.2 KiB
C#
59 lines
2.2 KiB
C#
// Copyright (c) Six Labors.
|
|
// Licensed under the Six Labors Split License.
|
|
|
|
using SixLabors.ImageSharp.PixelFormats;
|
|
using System.IO;
|
|
using System.Threading;
|
|
|
|
namespace SixLabors.ImageSharp.Formats.Webp {
|
|
/// <summary>
|
|
/// Image decoder for generating an image out of a webp stream.
|
|
/// </summary>
|
|
public sealed class WebpDecoder : SpecializedImageDecoder<WebpDecoderOptions>
|
|
{
|
|
private WebpDecoder()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the shared instance.
|
|
/// </summary>
|
|
public static WebpDecoder Instance { get; } = new();
|
|
|
|
/// <inheritdoc/>
|
|
protected override ImageInfo Identify(DecoderOptions options, Stream stream, CancellationToken cancellationToken)
|
|
{
|
|
Guard.NotNull(options, nameof(options));
|
|
Guard.NotNull(stream, nameof(stream));
|
|
|
|
using WebpDecoderCore decoder = new(new WebpDecoderOptions { GeneralOptions = options });
|
|
return decoder.Identify(options.Configuration, stream, cancellationToken);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
protected override Image<TPixel> Decode<TPixel>(WebpDecoderOptions options, Stream stream, CancellationToken cancellationToken)
|
|
{
|
|
Guard.NotNull(options, nameof(options));
|
|
Guard.NotNull(stream, nameof(stream));
|
|
|
|
using WebpDecoderCore decoder = new(options);
|
|
Image<TPixel> image = decoder.Decode<TPixel>(options.GeneralOptions.Configuration, stream, cancellationToken);
|
|
|
|
ScaleToTargetSize(options.GeneralOptions, image);
|
|
|
|
return image;
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
protected override Image Decode(WebpDecoderOptions options, Stream stream, CancellationToken cancellationToken)
|
|
=> this.Decode<Rgba32>(options, stream, cancellationToken);
|
|
|
|
/// <inheritdoc/>
|
|
protected override Image Decode(DecoderOptions options, Stream stream, CancellationToken cancellationToken)
|
|
=> this.Decode<Rgba32>(options, stream, cancellationToken);
|
|
|
|
/// <inheritdoc/>
|
|
protected override WebpDecoderOptions CreateDefaultSpecializedOptions(DecoderOptions options) => new() { GeneralOptions = options };
|
|
}
|
|
}
|