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 CasagrandeCom 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!