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 @@
-
+