From 7965902b14b1c9e8b5c43f836698cd0ab30e8bbf Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Mon, 16 May 2022 15:02:05 +0100 Subject: [PATCH] Saxonite v1.2.6.0 --- SacsStandardBase/Base/Core/SacsDfn.cs | 1 + .../Base/Helpers/SacsContentTypeHelper.cs | 2 +- SacsStandardBase/Base/Utils/ImageUtils.cs | 94 +++++++++++++++++-- SacsStandardBase/SacsStandardBase.csproj | 2 +- 4 files changed, 91 insertions(+), 8 deletions(-) diff --git a/SacsStandardBase/Base/Core/SacsDfn.cs b/SacsStandardBase/Base/Core/SacsDfn.cs index 7a05d6a..add4020 100644 --- a/SacsStandardBase/Base/Core/SacsDfn.cs +++ b/SacsStandardBase/Base/Core/SacsDfn.cs @@ -145,6 +145,7 @@ namespace Sarand.Net.Standard.Base.Core // Images. Png, Jpeg, + Webp, Bmp, Gif, Tif, diff --git a/SacsStandardBase/Base/Helpers/SacsContentTypeHelper.cs b/SacsStandardBase/Base/Helpers/SacsContentTypeHelper.cs index bde5764..b4491bf 100644 --- a/SacsStandardBase/Base/Helpers/SacsContentTypeHelper.cs +++ b/SacsStandardBase/Base/Helpers/SacsContentTypeHelper.cs @@ -139,7 +139,7 @@ namespace Sarand.Net.Standard.Base.Helpers new ContentTypeData_Internal("wav", "Waveform Audio Format", "audio/wav"), new ContentTypeData_Internal("webm", "WEBM video", "video/webm"), new ContentTypeData_Internal("weba", "WEBM audio", "audio/webm"), - new ContentTypeData_Internal("webp", "WEBP image", "image/webp"), + new ContentTypeData_Internal("webp", "WEBP image", "image/webp", Sacs.MimeType.Webp), new ContentTypeData_Internal("woff", "Web Open Font Format (WOFF)", "application/font-woff"), new ContentTypeData_Internal("woff", "Web Open Font Format (WOFF)", "font/woff") { PreferredContentType = "application/font-woff" }, new ContentTypeData_Internal("woff2", "Web Open Font Format (WOFF)", "font/woff2"), diff --git a/SacsStandardBase/Base/Utils/ImageUtils.cs b/SacsStandardBase/Base/Utils/ImageUtils.cs index 118a70e..5c9d559 100644 --- a/SacsStandardBase/Base/Utils/ImageUtils.cs +++ b/SacsStandardBase/Base/Utils/ImageUtils.cs @@ -1,8 +1,14 @@ using Sarand.Net.Standard.Base.App; +using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.Helpers; using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; using System; using System.Collections.Generic; +using System.IO; using System.Text; namespace Sarand.Net.Standard.Base.Utils @@ -19,10 +25,20 @@ namespace Sarand.Net.Standard.Base.Utils public class ImageConfig { public byte[] ImageData { get; set; } + public string ImageFormatName; + public string DefaultMimeType; + public Sacs.MimeType MimeType; public bool ValidImage { get; set; } public int Width { get; set; } public int Height { get; set; } } + + //------------------------------------------------------------------- + /// + /// Convert the data stream to an image and extract width and height. + /// + /// + /// Flag to indicate whether interpretation of image data succeeded. public static ImageConfig VerifyImageData(byte[] imageData) { String fn = className + ".VerifyImageData"; @@ -30,12 +46,17 @@ namespace Sarand.Net.Standard.Base.Utils imageConfig.ImageData = imageData; try { - var image = Image.Load(imageData); - if (image == null) return imageConfig; - imageConfig.Width = image.Width; - imageConfig.Height = image.Height; + IImageFormat imageFormat = null; + using (var image = LoadImage(imageData, out imageFormat)) + { + if (image == null) return imageConfig; + imageConfig.ImageFormatName = imageFormat.Name; + imageConfig.DefaultMimeType = imageFormat.DefaultMimeType; + imageConfig.MimeType = EnumUtil.ParseEnum(imageConfig.ImageFormatName, Sacs.MimeType.Unknown); + imageConfig.Width = image.Width; + imageConfig.Height = image.Height; + } imageConfig.ValidImage = true; - return imageConfig; } catch (Exception exc) { @@ -44,12 +65,73 @@ namespace Sarand.Net.Standard.Base.Utils return imageConfig; } + //------------------------------------------------------------------- // Load from byte array. - public static Image LoadImage(byte[] imageData) + /// Convert the data stream to an image. + public static SixLabors.ImageSharp.Image LoadImage(byte[] imageData) { var image = Image.Load(imageData); return image; } + /// + /// Convert the data stream to an image. + /// Identify the image's format on load. + /// + public static SixLabors.ImageSharp.Image LoadImage(byte[] imageData, out IImageFormat format) + { + var image = Image.Load(imageData, out format); + return image; + } + + //------------------------------------------------------------------- + // Convert to byte array. + /// Convert the data stream to an image. + public static Byte[] GetImageData(this SixLabors.ImageSharp.Image image, IImageFormat imageFormat) + { + using (MemoryStream ms = new MemoryStream()) + { + var imageEncoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(imageFormat); + image.Save(ms, imageEncoder); + return ms.ToArray(); + } + } + + //------------------------------------------------------------------- + /// + /// Resize the image with the specified limits, if required. + /// + /// Image data + /// + /// + /// Flag to indicate whether operation was successful. + public static bool ConstrainImage(ImageConfig config, ushort widthMax, ushort heightMax) + { + String fn = className + ".ConstrainImage"; + if (widthMax < 1 || heightMax < 1) return false; + if (config.Width <= widthMax && config.Height <= heightMax) return true; + config.ValidImage = false; + + try + { + // Resize the image. + IImageFormat imageFormat = null; + using (var image = LoadImage(config.ImageData, out imageFormat)) + { + double resizeProportion = Math.Min(widthMax / (double)image.Width, heightMax / (double)image.Height); + image.Mutate(img => img.Resize((int)(image.Width * resizeProportion), (int)(image.Height * resizeProportion))); + config.ImageData = image.GetImageData(imageFormat); + config.Width = image.Width; + config.Height = image.Height; + config.ValidImage = true; + } + } + catch (Exception exc) + { + SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc)); + } + + return config.ValidImage; + } //------------------------------------------------------------------- } diff --git a/SacsStandardBase/SacsStandardBase.csproj b/SacsStandardBase/SacsStandardBase.csproj index aaefc57..c465440 100644 --- a/SacsStandardBase/SacsStandardBase.csproj +++ b/SacsStandardBase/SacsStandardBase.csproj @@ -11,7 +11,7 @@ - +