» Redimensionando imagens proporcionalmente
21/10/2015    C#.NET

Olá!
Nesse artigo vou mostrar de maneira simples como utilizar um algoritmo em C# para redimensionar imagens.

Vou mostrar uma função que realiza tal operação e explicá-la, no final você poderá utilizá-la da seguinte forma:

            redimensiona_imagem("C:\foto.jpg", "C:\foto_menor.jpg", 100, 0);
        
O primeiro parâmetro da função é o caminho da imagem original, o segundo é o caminho da nova imagem, o terceiro é o tamanho horizontal da nova imagem e o último é o tamanho vertical ('zero' indica para manter a proporção do tamanho vertical baseado no novo tamanho horizontal).


Vamos começar a escrever a função:

            public static Boolean redimensiona_imagem(string xOrigem, string xDestino, int xLargura, int xAltura)
            { } 
        
A explicação de cada parâmetro está logo a cima.

Todo o código que será trabalhado a partir de agora estará dentro da função redimensiona_imagem. Primeiro iremos criar todas as variáveis que serão usadas no processo:

            System.Drawing.Image original;
            System.Drawing.Image nova;
            Int32 altura = 0;
            Boolean retorno = true;
        


Após as variáveis declaradas, vamos iniciar as ações.
O primeiro passo é deletar a imagem que se encontra no local de destino com o mesmo nome do destino, para que nossa nova imagem possa ir para lá sem problemas, então vamos inserir essa ação:

            // Deleta a imagem no destino caso exista
            if (File.Exists(xArquivo))
            {
                File.Delete(xArquivo);
            }
        


A próxima etapa é jogar a imagem original dentro da variável correspondente a ela para que possamos pegar as informações de largura e altura:

            original = System.Drawing.Image.FromFile(xOrigem);
        


A largura da imagem deve vir no parâmetro da função, ou seja, no 'xLargura'. Porém o tamanho vertical pode vir como 'zero', o que indica que o tamanho vertical não importa, ele somente deve ficar proporcional à largura, então precisaremos calcular isso para a imagem final não ficar distorcida:

            // Define a altura
            if (xAltura == 0)
            { altura = (original.Height * xLargura) / original.Width; }
            else
            { altura = xAltura; }
        


Agora que já temos a largura e altura da nova imagem, vamos criá-la lembrando que a função só irá redimensionar caso a imagem original seja maior do que a largura e altura informada na função, caso contrário a função iria esticar a imagem, o que perderia a qualidade.

            // Cria a nova imagem, redimensionada se necessario
            try
            {
                if (original.Width > xLargura)
                { nova = original.GetThumbnailImage(xLargura, altura, null, System.IntPtr.Zero); }
                else
                { nova = original; }
                
                nova.Save(xDestino);
                original.Dispose();
            }
        
Primeiro verificamos se a largura da original é maior do que a largura informada na função, caso seja então a nova imagem é gerada a partir da imagem original, caso ela seja menor, então a nova imagem será a imagem original.
A nova imagem é salva no destino e o objeto é liberado com o comando Dispose.
Note que todo o processo está dentro de try, pois caso haja algum problema no processo, não haverá bug.


            catch (Exception ex)
            {
                retorno = false;
            }
            return retorno;
        
Encerramos a cláusula try com o catch, então caso tenha havido algum erro a função retornará false, se tudo ocorreu como planejado, então ela prosseguirá e retornará true.

Então no final temos a função completa como abaixo:

            public static Boolean redimensiona_imagem(string xOrigem, string xDestino, int xLargura, int xAltura)
            {
                System.Drawing.Image original;
                System.Drawing.Image nova;
                Int32 altura = 0;
                Boolean retorno = true;

                // Deleta a imagem no destino caso exista
                if (File.Exists(xArquivo))
                {
                    File.Delete(xArquivo);
                }

                original = System.Drawing.Image.FromFile(xOrigem);
                
                // Define a altura
                if (xAltura == 0)
                { altura = (original.Height * xLargura) / original.Width; }
                else
                { altura = xAltura; }
            
                // Cria a nova imagem, redimensionada se necessario
                try
                {
                    if (original.Width > xLargura)
                    { nova = original.GetThumbnailImage(xLargura, altura, null, System.IntPtr.Zero); }
                    else
                    { nova = original; }
                    nova.Save(xDestino);
                    original.Dispose();
                }
                catch (Exception ex)
                {
                    retorno = false;
                }
                return retorno;
            } 
        

É isso pessoal, agora é só usar a imaginação e adaptá-la à necessidade do seu projeto caso necessário.
Até a próxima!




Comentários