.NET

15 jul, 2011

Redimensionando imagens com .NET

Publicidade

Com o uso das bibliotecas System.Drawing e System.Drawing.Imaging, podemos redimensionar imagens a um tamanho bem menor sem perder a qualidade.

Primeiro pegue uma imagem grande e de boa resolução. Nesse caso, vou usar uma imagem de 900×900 para redimensioná-la para os tamanhos 400×400, 250×2500, 120×120 e 48×48.

Crie um novo projeto do tipo Console Application no Visual Studio 2010, adicione referência à biblioteca System.Drawing e no método Main adicione o seguinte código:

            // variável que guardará as imagens que serão redimensionadas
            List<string> enderecosDeImagens = new List<string>();
            //Obtém a lista de imagens
            enderecosDeImagens = Imagem.ObterImagensNaoRedimensionadas();
            // variável que guardará as resoluções que serão usadas
            List<Resolucao> resolucoes = new List<Resolucao>();
            resolucoes.Add(Resolucao._400x400);
            resolucoes.Add(Resolucao._250x250);
            resolucoes.Add(Resolucao._120x120);
            resolucoes.Add(Resolucao._48x48);
            // método que irá redimensionar as imagens conforme as resoluções
            Imagem.RedimensionarArquivos(enderecosDeImagens, resolucoes);

Nesse código foi criada uma lista de strings que conterá os endereços das imagens não redimensionadas, uma lista do tipo resolução, e depois passamos por parâmetro os endereços das imagens e as resoluções que queremos ter. Aproveite para criar o Enum Resolucao.

public enum Resolucao
{
_48x48 = 48,
_120x120 = 120,
_250x250 = 250,
_400x400 = 400
}

Crie agora uma classe static chamada Imagem, adicione o método ObterImagensNaoRedimensionadas que retornará uma lista de string, o método RedimensionarArquivos que será void, o método CriarPastas que será void, o método RedimensionarArquivo que será booleano, o método SalvarImagem que será void e, por último, o método ObterInformacaoDeCodificacao, que retornará um ImageCodecInfo.

ObterImagensNaoRedimensionadas

List<string> imagensNaoRedimensionadas = new List<string>();
imagensNaoRedimensionadas = System.IO.Directory.GetFiles(@”D:ArtigosImagesimg900×900?).ToList();
return imagensNaoRedimensionadas;
RedimensionarArquivos
CriarPastas(resolucoes);
Dictionary<string, bool> arquivosRedimensionados = new Dictionary<string, bool>();
foreach (string enderecoDoArquivo in enderecosDosArquivos)
{
foreach (Resolucao resolucao in resolucoes)
{
if (RedimensionarArquivo(enderecoDoArquivo, resolucao))
{
arquivosRedimensionados.Add(string.Format(“{0} – {1}”, enderecoDoArquivo, resolucao), true);
}
else
{
arquivosRedimensionados.Add(string.Format(“{0} – {1}”, enderecoDoArquivo, resolucao), true);
}
}
}

CriarPastas

foreach (Resolucao resolucao in resolucoes)
{
string pasta = string.Format(@”D:ArtigosImagesimg{0}x{0}”, (int)resolucao);
if (System.IO.Directory.Exists(pasta) == false)
{
System.IO.Directory.CreateDirectory(pasta);
}
}
RedimensionarArquivo
bool resultado = true;
try
{
Bitmap imagemAtual = new System.Drawing.Bitmap(enderecoArquivo);
Bitmap ImagemRedimensionada = new System.Drawing.Bitmap((int)resolucao, (int)resolucao);
using (Graphics g = Graphics.FromImage((Image)ImagemRedimensionada))
{
g.DrawImage(imagemAtual, 0, 0, (int)resolucao, (int)resolucao);
}
System.IO.FileInfo fi = new System.IO.FileInfo(enderecoArquivo);
string destino = string.Format(@”D:ArtigosImagesimg{0}x{0}{1}”, (int)resolucao, fi.Name);
Imagem.SalvarImagem(destino, ImagemRedimensionada, 85L);
}
catch (Exception ex)
{
throw ex;
}
return resultado;

SalvarImagem

// Encoder parameter for image quality
EncoderParameter qualidade =
new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
// Jpeg image codec
ImageCodecInfo jpegCodec = ObterInformacaoDeCodificacao(“image/jpeg”);
if (jpegCodec == null)
return;
EncoderParameters parametrosDeCodificacao = new EncoderParameters(1);
parametrosDeCodificacao.Param[0] = qualidade;
img.Save(path, jpegCodec, parametrosDeCodificacao);

ObterInformacaoDeCodificacao

// Get image codecs for all image formats
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
// Find the correct image codec
for (int i = 0; i < codecs.Length; i++)
{
if (codecs[i].MimeType == mimeType)
{
return codecs[i];
}
}
return null;

Entendendo os métodos

ObterImagensNaoRedimensionadas: retorna uma lista de string baseado nos arquivos da pasta que contém os arquivos que deverão ser redimensionados através da biblioteca System.IO, usando a classe Directory e o método GetFiles.

CriarPastas: baseado na variável resoluções, todas as pastas com o mesmo valor que está em item da lista é criada, isso é feito porque iremos salvar os arquivos redimensionadas cada um na pasta conforme sua resolução.

O RedimensionarArquivo: é o método que chave desse artigo. Dois objetos do tipo Bitmap, imagemAtual e imagemRedimensionada, o primeiro é o arquivo no tamanho o original, o segundo é o arquivo baseado na resolução recebida. Criamos um objeto do tipo Graphics baseado no objeto imagemRedimensionada e a partir desse objeto usando o DrawImage, passando o objeto imagem atual, e a resolução desejada. Pegamos o FileInfo da imagem atual para termos o nome da imagem, no objeto destino definimos onde o arquivo será salvo, utilizamos o método SalvarImagem.

SalvarImagem: aqui pegamos a qualidade da imagem através do objeto EncoderParameter. Nesse caso estamos recebendo 85L, e fui testando até chegar nesse valor, que julguei bom, chamamos o ObterInformacaoDeCodificacao para ter informação do objeto ImagemCodecInfo. E caso não tenha essa informação então damos um return, definimos os parâmetros da codificação e salvamos a imagem (objeto Bitmap) com os dados do destino, dados do codec e parâmetros de codificação.

ObterInformacaoDeCodificacao: obtém as informações do codec que especificamos de um array de codec’s que o dot net pega em ImageCodecInfo.GetImageEncoders

RedimensionarArquivos: chama o método CriarPastas, após isso é definida uma variável arquivosRedimensionados que é um Dictionary composto pelos tipos string e bool, essa variável guardará na string o arquivo e a resolução e no bool se o arquivo foi gerado ou não. Fazemos um loop com foreach na lista enderecosDosArquivos, para pegar cada arquivo que será redimensionado, dentro desse loop fazemos um outro loop na lista resolucoes e dentro dela fazemos o redimensionamento de cada arquivo para sua resolução, e validamos se o método RedimensionarArquivo retornou true ou false para adicionarmos em arquivosRedimensionados.

É isso! Espero que esse artigo possa contribuir para o crescimento da comunidade.

Até a próxima!