summaryrefslogtreecommitdiffstats
path: root/solve/PhotoEditor/Controllers/DynamicPhotoEditorController.cs
blob: 6cdee0a4e20ed0cea2f34f9449a1a72bcab467f9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using PhotoEditor.Models;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Advanced;
using Newtonsoft.Json;

namespace PhotoEditor.Controllers;

[ApiController]
[Route("api/[controller]")]
public class DynamicPhotoEditorController : BaseAPIController
{
    private readonly ILogger<DynamicPhotoEditorController> _logger;
    private Image _cachedImage = null;

    public DynamicPhotoEditorController(ILogger<DynamicPhotoEditorController> logger)
    {
        _logger = logger;
    }


    [HttpPost]
    [Route("EditImage")]
    public IActionResult EditImage([FromBody]PhotoTransferRequestModel photoTransferRequestModel)
    {
        try {
            this._cachedImage = Image.Load(Convert.FromBase64String(photoTransferRequestModel.Base64Blob));
            _logger.LogTrace(0, "Loaded Image: {0}", this._cachedImage);

            var actionMethod = this.GetType().GetMethod(photoTransferRequestModel.DynamicAction);
            if (actionMethod == null) {
                throw new Exception("Unable to find dynamic action: " + photoTransferRequestModel.DynamicAction);
            }

            var editParams = (object[])JsonConvert.DeserializeObject<object[]>(photoTransferRequestModel.Parameters);
            if (photoTransferRequestModel.Types != null) {
                for (int i = 0; i < photoTransferRequestModel.Types.Length; i++) {
                    editParams[i] = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(editParams[i]),GetTypeByName(photoTransferRequestModel.Types[i]));
                }
            }
            
            _logger.LogWarning(0, "Params: {0} Raw: {1}", editParams, photoTransferRequestModel.Parameters);

            var transformedImage = (Image)actionMethod.Invoke(this, editParams);
            
            var imageAsBase64 = ImageToBase64(transformedImage);

            var retValue = new PhotoTransferResponseModel();    
            retValue.Base64Blob = imageAsBase64;
            return Ok(retValue);
        }
        catch (Exception e) {
            Console.WriteLine(e.ToString());
            var retValue = new PhotoTransferResponseModel();    
            retValue.Error = e.Message;
            return StatusCode(StatusCodes.Status500InternalServerError, retValue);
        }
    }

    private Type GetTypeByName(String name) {
        return AppDomain.CurrentDomain.GetAssemblies()
            .Reverse()
            .Select(assembly => assembly.GetType(name))
            .FirstOrDefault(t => t != null);
    }

    public String ImageToBase64(Image image) {

         using (var memoryStream = new MemoryStream())
        {
            var imageEncoder = image.Metadata.DecodedImageFormat;
            image.SaveAsPng(memoryStream);
            return Convert.ToBase64String(memoryStream.ToArray());
        }
    }

    public Image GrayscaleImage(double amount) {
        this._cachedImage.Mutate(m => m.Grayscale((float)amount));
        return this._cachedImage;
    }

    public Image BlackWhiteImage() {
        this._cachedImage.Mutate(m => m.BlackWhite());
        return this._cachedImage;
    }

    public Image RotateImage(double degrees) {
        this._cachedImage.Mutate(m => m.Rotate((float)degrees));
        return this._cachedImage;
    }

    public Image InvertImage() {
        this._cachedImage.Mutate(m => m.Invert());
        return this._cachedImage;
    }

    public Image CropImage(RectangleStruct rect) {
        this._cachedImage.Mutate(m => m.Crop(new Rectangle(rect.X, rect.Y, rect.W, rect.H)));
        return this._cachedImage;
    }
}