diff --git a/src/Berufsschule_HAM.csproj b/src/Berufsschule_HAM.csproj index 0989a79..10e8609 100644 --- a/src/Berufsschule_HAM.csproj +++ b/src/Berufsschule_HAM.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Controllers/HomeController.cs b/src/Controllers/HomeController.cs index 9d5555a..f050287 100644 --- a/src/Controllers/HomeController.cs +++ b/src/Controllers/HomeController.cs @@ -7,6 +7,7 @@ using Berufsschule_HAM.Services; using ElmahCore; using Berufsschule_HAM.Exceptions; using Microsoft.AspNetCore.Authorization; +using Berufsschule_HAM.Helpers; [ApiExplorerSettings(IgnoreApi = true)] [Route("[controller]")] @@ -82,9 +83,10 @@ public class HomeController : Controller List UserTableViewModels = []; foreach (UserModel user in users) { + string photo = user.JpegPhoto is not null && user.JpegPhoto.Length > 0 ? ImageHelper.ResizeAndConvertToBase64(Convert.FromBase64String(user.JpegPhoto), 32) : ""; UserTableViewModels.Add(new() { - JpegPhoto = user.JpegPhoto ?? "", + JpegPhoto = photo, Name = user.Cn ?? "", Surname = user.Sn ?? "", Title = user.Title ?? "", @@ -95,6 +97,24 @@ public class HomeController : Controller return View(new UsersIndexViewModel() { UserTableViewModels = UserTableViewModels }); } + [Authorize(Roles = "CanManageUsers")] + [HttpGet("UserPhoto")] + public async Task UserPhotoAsync(string uid, int? size) + { + UserModel? user = await _ldap.GetUserByUidAsync(uid, _ldap.UsersAttributes); + if (user is null || user.JpegPhoto is null) + { + return NotFound(); + } + if (size is null) + { + return File(Convert.FromBase64String(user.JpegPhoto), "image/jpeg"); + } + string encodedFile = ImageHelper.ResizeAndConvertToBase64(Convert.FromBase64String(user.JpegPhoto), size ?? 32); + return File(Convert.FromBase64String(encodedFile), "image/jpeg"); + } + + [Authorize(Roles = "CanManageGroups")] [HttpGet("Groups")] public async Task GroupsAsync() diff --git a/src/Helpers/ImageHelper.cs b/src/Helpers/ImageHelper.cs new file mode 100644 index 0000000..40b4824 --- /dev/null +++ b/src/Helpers/ImageHelper.cs @@ -0,0 +1,42 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Processing; +using SixLabors.ImageSharp.Formats.Jpeg; +using System.IO; +using SixLabors.ImageSharp.Formats.Gif; +using SixLabors.ImageSharp.Processing.Processors.Quantization; +using SixLabors.ImageSharp.Formats.Png; +using SixLabors.ImageSharp.Formats.Webp; + +namespace Berufsschule_HAM.Helpers; + +public static class ImageHelper +{ + public static string ResizeAndConvertToBase64(byte[] imageBytes, int size = 32) + { + size = Math.Min(size, 256); + using var inputStream = new MemoryStream(imageBytes); + using var image = Image.Load(inputStream); + + // Optional: crop to square before resize + 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(){}); + return Convert.ToBase64String(outputStream.ToArray()); + } +} \ No newline at end of file diff --git a/src/Views/Home/Users.cshtml b/src/Views/Home/Users.cshtml index cf34ecc..ca68980 100644 --- a/src/Views/Home/Users.cshtml +++ b/src/Views/Home/Users.cshtml @@ -41,7 +41,7 @@ { - Photo + Photo @userTableViewModel.Uid @userTableViewModel.Title @@ -730,13 +730,7 @@ // Photo const imgEl = row.querySelector('td:first-child img'); const detailPhoto = document.getElementById('detailPhoto'); - if (imgEl && imgEl.src.startsWith('data:image')) { - detailPhoto.src = imgEl.src; - detailPhoto.style.display = 'block'; - } else { - detailPhoto.style.display = 'none'; - } - + detailPhoto.src = `/Home/UserPhoto?uid=${data.uid}&size=256`; detailModal.show(); }); });