Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

[Resolvido] Redimensionando imagens com .NET

Recommended Posts

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.MimeType == mimeType)

{

return codecs;

}

}

return null;

Entendendo os métodos

<h4></h4>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!

 

 

 

http://imasters.com.br/artigo/16132/dotnet/redimensionando-imagens-com-net

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.