Resize image by query string in Azure function

Viewed 589

I am trying make an Azure function to resize images via a URL scheme, using a query string to return a resized image. I have looked at a few libraries. The most promising so far seems to be SixLabors ImageSharp solution which has middle-ware like ImageSharp.Web .

Unfortunately I can only find information on how to setup ASP.NET or WebAPI, similar to what is asked here ImageSharp.Web - resize image by querystring in Asp.Net Core 3.1 . I could code up something myself to handle the query parsing, but I was hoping there was already something existing so I do not need to roll my own.

Is there a library which lets me resize images via query string and runs in Azure function v2/v3?

1 Answers

Azure Function with Http Trigger and SixLabors ImageSharp do this good.

First you have to implement DownloadImageAsync to download file from url, from this sample code:

const int _downloadImageTimeoutInSeconds = 15;
static readonly HttpClient _httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(_downloadImageTimeoutInSeconds) };

public static async Task<byte[]> DownloadImageAsync(string imageUrl)
{
    try
    {
        using (var httpResponse = await _httpClient.GetAsync(imageUrl))
        {
            if (httpResponse.StatusCode == HttpStatusCode.OK)
            {
                return await httpResponse.Content.ReadAsByteArrayAsync();
            }
            else
            {
                //Url is Invalid
                return null;
            }
        }
    }
    catch (Exception e)
    {
        //Handle Exception
        return null;
    }
}

Now we have to create an Azure Function with GET method, Anonymous Authorization level to ensure all client will call it easier. ImageSharp for resizing is here and convert to based64 I referenced from here

[FunctionName("MyImageResizer")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
    ILogger log)
{
    string url = req.Query["url"];
    string width = req.Query["width"];
    string height = req.Query["height"];

    string result = string.Empty;
    using (Image image = Image.Load(await DownloadImageAsync(url)))
    {
        image.Mutate(x => x.Resize(int.Parse(width), int.Parse(height)));

        using (var ms = new MemoryStream())
        {
            image.Save(ms, new PngEncoder());
            image.Dispose();
            byte[] imageBytes = ms.ToArray();
            result = Convert.ToBase64String(imageBytes);
            imageBytes = null;
            ms.Dispose();
        }
        GC.Collect();
    }

    return new OkObjectResult(result);
}

After launched a program, the terminal will show MyImageResizer function and its request url

enter image description here

Test request in Postman

enter image description here

and result is:

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

Use some tool online to check, such as Base64-to-image-converter

Related