Code Screen

Redimensionando imagens com Azure Functions e Azure Storage

Olá pessoal, tudo bem? Nesse post vamos aprender como fazer um redimensionamento de imagens altamente escalável e muito simples utilizando Azure Functions e Azure Storage.

Primeiramente vamos criar uma conta de Storage no Azure e na sequência 2 containers no serviço de Blob. O primeiro container vai se chamar images (onde nossa Function vai monitorar), e o segundo vai se chamar thumbnails (onde salvaremos a nossa imagem redimensionada).

Dica: Caso esteja utilizando o sistema operacional Windows, você pode utilizar o Azure Storage Emulator para simular o serviço de Storage do Azure.

Logo depois de criarmos o serviço de Storage (seja no Azure ou simulando localmente através do Azure Storage Emulator), vamos abrir o Terminal (Ctrl + ‘) do Visual Studio Code, e digitarmos:

func init

Note que vão aparecer 4 opções de seleção, nesse caso, selecione a opção “dotnet”, e então, espere que termine a criação do nosso Function App.

Logo depois, nosso próximo passo será o de criar nossa Azure Function, e para isso, utilize o comando abaixo:

func new

Agora, dentre as diversas opções de Azure Functions, vamos escolher o tipo BlobTrigger e daremos a ela o nome de ImageResizerTrigger.

Seguindo, abra o arquivo .csproj do seu projeto e adicione o package da SixLabors.ImageSharp nele, igual a linha abaixo:

<PackageReference Include="SixLabors.ImageSharp" Version="1.0.0-rc0001" />

Na sequência o Visual Studio Code pedirá para que você faça um Restore na aplicação.

Assim que o Restore finalizar, abra o arquivo ImageResizerTrigger.cs e substitua-o com o código abaixo:

public static void Run([BlobTrigger("images/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, 
            [Blob("thumbnails/{name}", FileAccess.Write)] Stream outputBlob, ILogger log)
        {
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");

            using (var image = Image.Load(myBlob))
            {
                var resizeOptions = new ResizeOptions
                {
                    Size = new Size(640, 480),
                    Compand = true,
                    Mode = ResizeMode.Max
                };

                image.Mutate(ctx => ctx.Resize(resizeOptions));
                image.Save(outputBlob, new JpegEncoder { Quality = 80 });
            }
        }

Dessa forma, note no nosso código, que a nossa Azure Function estará sempre olhando para o container images, e seu “output” será sempre no container thumbnails.

Importante: A propriedade Connection esta “setada” com o valor: AzureWebJobsStorage. Esse valor na verdade esta contido no arquivo local.settings.json e você deverá colocar a string de conexão do seu Storage no mesmo.

Assim, faça o upload de uma imagem no container images e note que a imagem será automaticamente redimensionada e salva no container thumbnails, conforme nós queríamos.

Por fim, caso tenha interesse em mais conteúdos relacionados a Azure Functions e Azure Storage, convido você a dar uma olhada na série: Criando um CRUD Serverless com Azure Functions.

Espero que tenham gostado e até a próxima. Obrigado!

Leave a Reply

Your email address will not be published. Required fields are marked *