Desenvolvimento - C#

Redimensionando Imagens com Dot Net

Aprenda a redimensionar imagens com uso de Dot Net sem perder a qualidade e diminuindo o tamanho do arquivo.

por Oscar Casagrande



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

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

Criei um novo projeto do tipo Console Application no Visual Studio 2010, adicionei referência à biblioteca System.Drawing e no método Main adicionei 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 string’s que conterá os endereços das imagens não redimensionadas, uma lista do tipo resolução, e depois passamos por paramêtro os endereços das imanges e as resoluções que queremos ter. Apreveite para criar o Enum Resolucao

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

Crie uma classe static chamada Imagem, adicione o método ObterImagensNaoRedimensionadas que retornorá 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 eo 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 contem 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 resolucoes, 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

RedimensionarArquivo, esse é 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, eu fui testando até chegar nesse valor, que julguei bom, chamamos o ObterInformacaoDeCodificacao para ter informação do objeto ImagemCodecInfo, caso a gente 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!

Oscar Casagrande

Oscar Casagrande - Técnico em Processamento de Dados pelo Colégio Técnico Elevação, tecnólogo em Desenvolvimento de Sistemas para Web no Instituto Brasileiro de Tecnologia Avançado (IBTA, agora Instituto Veris) e fazendo pós-graduação em Engenharia de Sistemas com ênfase em SOA no Instituto Veris.
Blog:
http://oscarcasagrande.blogspot.com.