diff --git a/src/Controllers/HomeController.cs b/src/Controllers/HomeController.cs index 3f4e108..fc3e440 100644 --- a/src/Controllers/HomeController.cs +++ b/src/Controllers/HomeController.cs @@ -102,7 +102,7 @@ public class HomeController : Controller UserModel? user = await _ldap.GetUserByUidAsync(uid, _ldap.UsersAttributes); if (user is null || user.JpegPhoto is null || user.JpegPhoto == "") { - return File("user_default.jpeg", "image/jpeg"); + return File(ImageHelper.GetDefaultUserImage(size ?? 48), "image/webp"); } if (size is null) { diff --git a/src/Controllers/UsersController.cs b/src/Controllers/UsersController.cs index 2391301..5e4fd51 100644 --- a/src/Controllers/UsersController.cs +++ b/src/Controllers/UsersController.cs @@ -75,7 +75,7 @@ public class UsersController : Controller string? title = requestModel.Title; string userPassword = requestModel.UserPassword ?? ""; UserDescription? description = requestModel.Description; - jpegPhoto ??= Convert.ToBase64String(System.IO.File.ReadAllBytes("wwwroot/user_default.jpeg")); // TODO: cleanup - make this a config setting + jpegPhoto ??= ImageHelper.GetDefaultUserImageAsBase64(); string uid = UsersHelper.CreateUsername(requestModel.Cn ?? "", requestModel.Sn ?? ""); title ??= ""; description ??= new() {Address = new(), BirthDate = "", Workplace = "", Groups = []}; diff --git a/src/Helpers/ImageHelper.cs b/src/Helpers/ImageHelper.cs index e0baa08..b230c87 100644 --- a/src/Helpers/ImageHelper.cs +++ b/src/Helpers/ImageHelper.cs @@ -2,6 +2,7 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Webp; using SixLabors.ImageSharp.Formats; using Berufsschule_HAM.Models; +using SixLabors.ImageSharp.Processing; namespace Berufsschule_HAM.Helpers; @@ -30,6 +31,23 @@ public static class ImageHelper using var image = Image.Load(decoderOptions, inputStream); + int minDimension = Math.Min(image.Width, image.Height); + var cropRectangle = new Rectangle( + (image.Width - minDimension) / 2, + (image.Height - minDimension) / 2, + minDimension, + minDimension); + + image.Mutate(x => + { + x.Crop(cropRectangle); + x.Resize(new ResizeOptions + { + Size = new Size(size, size), + Mode = ResizeMode.Crop + }); + }); + using var outputStream = new MemoryStream(); image.Save(outputStream, new WebpEncoder()); result = outputStream.ToArray(); @@ -38,6 +56,16 @@ public static class ImageHelper return result; } + public static byte[] GetDefaultUserImage(int size = 48) + { + return ResizeAndConvertToWebp(GetDefaultUserImageAsBase64(), size); + } + + public static string GetDefaultUserImageAsBase64() + { + return Convert.ToBase64String(File.ReadAllBytes("wwwroot/user_default.webp")); + } + public static async Task PreloadUsers(IEnumerable userModels, UserImagePreloadType? preloadType) { if (preloadType is null || preloadType == UserImagePreloadType.None) return; diff --git a/src/wwwroot/user_default.jpeg b/src/wwwroot/user_default.jpeg deleted file mode 100644 index 0141c99..0000000 Binary files a/src/wwwroot/user_default.jpeg and /dev/null differ diff --git a/src/wwwroot/user_default.webp b/src/wwwroot/user_default.webp new file mode 100644 index 0000000..8f8687d Binary files /dev/null and b/src/wwwroot/user_default.webp differ