From 1b751781f0681a047f3d3d6097009478886ee2f5 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 27 Apr 2021 18:52:57 +0800 Subject: refactor: ... --- BackEnd/Timeline/Services/Imaging/ImageService.cs | 54 +++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 BackEnd/Timeline/Services/Imaging/ImageService.cs (limited to 'BackEnd/Timeline/Services/Imaging/ImageService.cs') diff --git a/BackEnd/Timeline/Services/Imaging/ImageService.cs b/BackEnd/Timeline/Services/Imaging/ImageService.cs new file mode 100644 index 00000000..9fefe3e9 --- /dev/null +++ b/BackEnd/Timeline/Services/Imaging/ImageService.cs @@ -0,0 +1,54 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Timeline.Services.Imaging +{ + + public class ImageService : IImageService + { + public async Task DetectFormatAsync(byte[] data, CancellationToken cancellationToken = default) + { + if (data == null) + throw new ArgumentNullException(nameof(data)); + + var format = await Task.Run(() => + { + var format = Image.DetectFormat(data); + if (format is null) + { + throw new ImageException(ImageException.ErrorReason.CantDecode, data, null, null, null); + } + return format; + }, cancellationToken); + return format; + } + + public async Task ValidateAsync(byte[] data, string? requestType = null, bool square = false, CancellationToken cancellationToken = default) + { + if (data == null) + throw new ArgumentNullException(nameof(data)); + + var format = await Task.Run(() => + { + try + { + using var image = Image.Load(data, out IImageFormat format); + if (requestType != null && !format.MimeTypes.Contains(requestType)) + throw new ImageException(ImageException.ErrorReason.UnmatchedFormat, data, requestType, format.DefaultMimeType); + if (square && image.Width != image.Height) + throw new ImageException(ImageException.ErrorReason.BadSize, data, requestType, format.DefaultMimeType); + return format; + } + catch (UnknownImageFormatException e) + { + throw new ImageException(ImageException.ErrorReason.CantDecode, data, requestType, null, null, e); + } + }, cancellationToken); + return format; + } + } +} -- cgit v1.2.3