From 6f411c3c52cd1d0fd11694884131865ef366d8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Henrique=20Ivanchechen?= Date: Wed, 16 Aug 2023 15:58:01 -0300 Subject: [PATCH] mini refactor --- Controllers/Blur.cs | 51 ++++++++------------------------ Program.cs | 6 +++- Properties/Resources.Designer.cs | 2 +- Services/ImageService.cs | 49 ++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 40 deletions(-) create mode 100644 Services/ImageService.cs diff --git a/Controllers/Blur.cs b/Controllers/Blur.cs index 0bea165..1f79152 100644 --- a/Controllers/Blur.cs +++ b/Controllers/Blur.cs @@ -1,55 +1,30 @@ -using ImageMagick; -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; +using TCC.Services; -namespace tcc_app.Controllers +namespace TCC.Controllers { [ApiController] [Route("")] public class ImageController : ControllerBase { + private ImageService ImageService { get; set; } + + public ImageController(ImageService imageService) + { + this.ImageService = imageService; + } + [HttpPost("blur")] public async Task BlurImage() { MemoryStream mstream = new MemoryStream(); await HttpContext.Request.Body.CopyToAsync(mstream); + mstream.Position = 0; - var image = new MagickImage(new MemoryStream(mstream.ToArray())); - var blurredImage = new MagickImage(image); - var pixels = image.GetPixels(); - var blurredPixels = blurredImage.GetPixelsUnsafe(); - - foreach (var pixel in pixels) - { - int x = pixel.X, - y = pixel.Y; - - long rTotal = 0, gTotal = 0, bTotal = 0; - int pixelCount = 0; - for (short offsetY = -5; offsetY <= 5; offsetY++) - { - for (short offsetX = -5; offsetX <= 5; offsetX++) - { - int newX = x + offsetX; - int newY = y + offsetY; - - if (newX >= 0 && newX < image.Width && newY >= 0 && newY < image.Height) - { - var pixelColor = pixels[newX, newY]; - rTotal += pixelColor.GetChannel(0); - gTotal += pixelColor.GetChannel(1); - bTotal += pixelColor.GetChannel(2); - pixelCount++; - } - } - } - - blurredPixels[x, y].SetChannel(0, Convert.ToUInt16(rTotal / pixelCount)); - blurredPixels[x, y].SetChannel(1, Convert.ToUInt16(gTotal / pixelCount)); - blurredPixels[x, y].SetChannel(2, Convert.ToUInt16(bTotal / pixelCount)); - } + var result = ImageService.BoxBlurImage(mstream, 5); var blurredImageStream = new MemoryStream(); - blurredImage.Write(blurredImageStream); + result.Write(blurredImageStream); blurredImageStream.Position = 0; return File(blurredImageStream, "image/png"); diff --git a/Program.cs b/Program.cs index f93b7c1..15bc8a4 100644 --- a/Program.cs +++ b/Program.cs @@ -1,4 +1,6 @@ -namespace tcc_app +using TCC.Services; + +namespace TCC { public class Program { @@ -6,6 +8,8 @@ namespace tcc_app { var builder = WebApplication.CreateBuilder(args); + builder.Services.AddScoped(); + builder.Services.AddControllers(); var app = builder.Build(); diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 31d9a2f..56da146 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace tcc_app.Properties { +namespace TCC.Properties { using System; diff --git a/Services/ImageService.cs b/Services/ImageService.cs new file mode 100644 index 0000000..4ec4c5c --- /dev/null +++ b/Services/ImageService.cs @@ -0,0 +1,49 @@ +using ImageMagick; + +namespace TCC.Services +{ + public class ImageService + { + public ImageService() { } + + public MagickImage BoxBlurImage(Stream imageStream, int radius) + { + var image = new MagickImage(imageStream); + var blurredImage = new MagickImage(image); + var pixels = image.GetPixels(); + var blurredPixels = blurredImage.GetPixelsUnsafe(); + + foreach (var pixel in pixels) + { + int x = pixel.X, + y = pixel.Y; + + long rTotal = 0, gTotal = 0, bTotal = 0; + int pixelCount = 0; + for (int offsetY = -radius; offsetY <= radius; offsetY++) + { + for (int offsetX = -radius; offsetX <= radius; offsetX++) + { + int newX = x + offsetX; + int newY = y + offsetY; + + if (newX >= 0 && newX < image.Width && newY >= 0 && newY < image.Height) + { + var pixelColor = pixels[newX, newY]; + rTotal += pixelColor.GetChannel(0); + gTotal += pixelColor.GetChannel(1); + bTotal += pixelColor.GetChannel(2); + pixelCount++; + } + } + } + + blurredPixels[x, y].SetChannel(0, Convert.ToUInt16(rTotal / pixelCount)); + blurredPixels[x, y].SetChannel(1, Convert.ToUInt16(gTotal / pixelCount)); + blurredPixels[x, y].SetChannel(2, Convert.ToUInt16(bTotal / pixelCount)); + } + + return blurredImage; + } + } +}