Desenvolvimento - C#

Redimensionando imagens - C#

Este artigo mostra como é simples redimensionar uma imagem.

por Marcelo Marques



Artigo atualizado em 02/09/2008 para que as imagens com o código do artigo sejam substuídas por texto.

1. Introdução

Em alguns momentos é necessário alterar o tamanho de uma imagem, seja para postá-la em um site ou simplesmente para encaixá-la melhor em uma apresentação. Com isto, neste artigo iremos abordar uma forma simples e prática de redimensionar uma imagem.

Iremos utilizar o VS2005 como ferramenta de desenvolvimento, a linguagem C#, arquivo do tipo Generic Handler para mostrar a imagem.

2. Arquivo Generic Handler

Este arquivo irá permitir mostrar a imagem imprimindo a mesma como se estivesse imprimindo em uma página .aspx qualquer. O Generic Handler é herdado da interface IHttpHandler, o objeto do qual as paginas ASP.NET também herdam, porém não é interessante utilizar uma página .aspx, pois a mesma herda da classe Page, que é a mais complexa das heranças do IHttpHandler, ou seja, ao utilizar uma página .aspx, seria gerado uma sobrecarga de processamento desnecessária, pois a interface IHttpHandler exige a implementação de um método ProcessRequest, o qual é executado para todo o processamento da chamada. Neste caso iremos implementar o método ProcessRequest fazendo com que o mesmo faça apenas o que nos convém evitando as chamadas desnecessárias mencionadas.

3. Criando o arquivo HandlerImagem.ashx

Adicione um novo objeto do tipo Generic Handler(imagem 1).


Imagem 1 - Adicionando o arquivo que irá receber a imagem.

3.1 . Código do método ProcessRequest.

O código abaixo é o código que irá gerar a imagem. Este será o responsável por gravar a imagem no Generic Handler(HandlerImagem.ashx).
        public void ProcessRequest(HttpContext pObjContext) {

            // Recupera os parâmetros passados pela página onde as imagens serão apresentadas.
            string strSrcImagemOriginal = pObjContext.Request.QueryString[0].ToString();
            string strTamanhoImagemRedimensionar = pObjContext.Request.QueryString[1].ToString();
            string strLarguraImagemRedimensionar = pObjContext.Request.QueryString[2].ToString();
            string strContentType = pObjContext.Request.QueryString[3].ToString();

            // Monta a imagem original.
            Stream objStream = new StreamReader(strSrcImagemOriginal).BaseStream;
            BinaryReader objBinaryReader = new BinaryReader(objStream);
            int i = (int)objStream.Length;
            byte[] arrBytes = objBinaryReader.ReadBytes(i);

            // Monta a imagem redimensionada.
            if (strTamanhoImagemRedimensionar.Length> 0 && strLarguraImagemRedimensionar.Length> 0) {

                // Lê os bytes da imagem original.
                MemoryStream objMemoryStream = new MemoryStream(arrBytes);

                // Monta uma nova imagem.
                System.Drawing.Bitmap imageBitmap = 
(System.Drawing.Bitmap)System.Drawing.Image.FromStream(objMemoryStream);

                // Atribui o tamanho à nova imagem.
                System.Drawing.Bitmap imageModificada = new 
System.Drawing.Bitmap((int)(int.Parse(strTamanhoImagemRedimensionar)),
                    (int)(int.Parse(strLarguraImagemRedimensionar)));

                // Define o desenho da nova imagem.
                Graphics graphic = Graphics.FromImage(imageModificada);
                graphic.DrawImage(imageBitmap, new System.Drawing.Rectangle(0, 0, imageModificada.Width, 
imageModificada.Height),
                    0, 0, imageBitmap.Width, imageBitmap.Height, System.Drawing.GraphicsUnit.Pixel);
                graphic.Dispose();
                MemoryStream objMemoryStreamModificado = new MemoryStream();

                // Salva a nova imagem no objeto de memória.
                imageModificada.Save(objMemoryStreamModificado, System.Drawing.Imaging.ImageFormat.Bmp);


                // Recupera os bytes da imagem modificada.
                arrBytes = objMemoryStreamModificado.GetBuffer();
            }

            // Monta a imagem.
            pObjContext.Response.ContentType = strContentType;
            pObjContext.Response.BinaryWrite(arrBytes);
        }

        public bool IsReusable {
            get {
                return false;
            }
        }


Além dos comentários postado no código seguem alguns detalhes:

Será necessário adicionar a herança System.IO para se trabalhar com os objetos Stream, BinaryReader e MemoryStream, que permitem manipular os bytes da imagem. Também será necessário adicionar a herança ao namespace System.Drawing para se trabalhar com o objeto Graphics, responsável por desenhar a imagem redimensionada.

4. Criando o arquivo RedimensionarImagem.aspx

Adicione um novo objeto do tipo Web Form(imagem 2). Este será o formulário para teste do código que irá redimensionar a imagem.


Imagem 2 - Adicionando um novo web form.

4.1. Atributos da interface

Com o código da imagem 1, já e possível redimensionar a imagem, porém vamos agora criar uma interface(imagem 2/ imagem 3) para que possamos testar este código.

Abaixo segue o layout da mesma.


Imagem 3 - Interface para testar o redimensionamento da imagem.

System.Web.UI.WebControls.Label labelTitulo - Título da tela.
System.Web.UI.WebControls.Image imagemRedmensionada - Imagem com o novo tamanho.
System.Web.UI.WebControls.Label labelImagem - Contem a inscrição "Imagem:".
System.Web.UI.HtmlControls.HtmlInputFile textImagem - Seleciona a imagem original.
System.Web.UI.WebControls.Label labelTamanhoImagem - Contem a inscrição "Tamanho Imagem:".
System.Web.UI.WebControls.TextBox textTamanho - Tamanho em pixels da imagem que será redimensionada.
System.Web.UI.WebControls.Label labelLarguraImagem - Contem a inscrição "Largura Imagem:".
System.Web.UI.WebControls.TextBox textLarguraImagem - Largura em pixels da imagem quer será redimensionada.
System.Web.UI.WebControls.Label labelRedimensionar - Contem a inscrição "Redimensionar Imagem:".
System.Web.UI.WebControls.Button buttonRedimensionar - Aciona o código que irá redimensionar a imagem original.
System.Web.UI.WebControls.Label labelMensagem - Mostra uma mensagem ao usuário caso necessário.
System.Web.UI.WebControls.Image imagemOriginal - Imagem com o tamanho original.

4.2. Código do buttonRedimensionar_Click.

O código abaixo é o responsável por passar as informações necessárias ao arquivo Generic Handler(HandlerImagem.ashx), informações que irão definir o tamanho, largura e tipo da imagem.
protected void buttonRedimensionar_Click(object sender, EventArgs e) {

            // Manipula a visibilidade dos campos da tela.
            labelMensagem.Visible = false;
            imagemOriginal.Visible = false;
            imagemRedmensionada.Visible = false;

            // Objeto que irá receber a imagem escolhida.
            HttpPostedFile objHttpPostedFile = textImagem.PostedFile;

            // Verifica se o usuário escolheu alguma image.
            if (objHttpPostedFile.FileName.Length == 0) {

                // Emite mensagem ao usuário.
                labelMensagem.Visible = true;
                labelMensagem.Text = "Selecione uma imagem para ser redimensionada!!!";
                labelMensagem.CssClass = "labelerror";
            } else {

                // Mostra a imagem com o seu tamanho original.
                imagemOriginal.ImageUrl = "HandlerImagem.ashx?UrlImagem=" +
                    objHttpPostedFile.FileName + "&TamanhoImagem=" + "&LarguraImagem=" + 
"&ContentType=" + objHttpPostedFile.ContentType;

                // Verifica se o usuário informou o novo tamanho e largura da imagem.
                if (textLarguraImagem.Text.Length> 0 && textTamanho.Text.Length> 0) {

                    // Mostra a imagem redimensionada.
                    imagemRedmensionada.ImageUrl = "HandlerImagem.ashx?UrlImagem=" + 
objHttpPostedFile.FileName + "&TamanhoImagem=" + textTamanho.Text + "&LarguraImagem=" + 
textLarguraImagem.Text + "&ContentType=" +
                        objHttpPostedFile.ContentType;

                    // Torna visível as imagens ao usuário.
                    imagemOriginal.Visible = true;
                    imagemRedmensionada.Visible = true;
                } else {

                    // Emite mensagem ao usuário.
                    labelMensagem.Visible = true;
                    labelMensagem.Text = 
					"Coloque o tamanho/largura ao qual deve ser redimensionada a imagem.";
                    labelMensagem.CssClass = "labelerror";
                    if (textLarguraImagem.Text.Length> 0)
                        textLarguraImagem.Focus();
                    else
                        textTamanho.Focus();
                }
            }
        }


Com o código do item 4.2 Código do buttonRedimensionar_Click é possível realizar o teste do redimensionamento da imagem. Além dos comentários no código, para um melhor entendimento, seguem alguns detalhes:
  • No código: imagemOriginal.ImageUrl = "HandlerImagem.ashx?UrlImagem=" + objHttpPostedFile.FileName + "&TamanhoImagem=" + "&LarguraImagem=" + "&ContentType=" + objHttpPostedFile.ContentType é importante saber que é passado o local(url) do arquivo que o usuário escolheu, o tamanho e largura da imagem que será redimensionada, e o tipo da imagem que o usuário escolheu.

  • Quando se trata da imagem original não é necessário passar o tamanho nem a largura.

  • Também é importante saber que ao se chamar o arquivo HandlerImagem.ashx é executado o método do passo 3.1 que irá montar uma imagem e a mesma será apresentada na imagem que a chamou, por exemplo: no código acima o objeto imagemOriginal é quem irá receber a imagem montada.

4. Concluindo

Com este artigo entendemos o quanto é simples redimensionar uma imagem.

Espero que tenha sido claro.

Aguardem novos artigos.

Abraços!!!

Att.
Marcelo Marques
Marcelo Marques

Marcelo Marques - Trabalha como desenvolvedor .NET desde 2004 pela fábrica de software Politec-TQR (www.politec.com.br) com a linguagem C#. Autodidata, perfeccionista, pesquisador em outras linguagens, entre as quais VB.NET, Java, PHP, etc. Pretende aumentar seu conhecimento expandindo rede de amigos para troca de informações além dos estudos individuais.