Desenvolvimento - C#

Manipulando imagens

Neste artigo veremos como manipular imagens, escrever sobre elas e criar thumbnails de forma simples utilizando os recursos do framework.

por Gabriel dos Santos Potumati



Introdução

Neste artigo veremos como manipular imagens, escrever sobre elas e criar thumbnails de forma simples utilizando os recursos do framework.

Preparando

Na página Default.aspx vá na Toolbox e na aba Standart e adicione os componentes FileUpload e LinkButton.
Nas propriedades do LinkButton mude o Text para "Enviar".


Figura 01. Exemplo.

Salvando e criando thumbnail

De um clique duplo sobre o LinkButton que assim irá para a parte onde iremos criar o código.
Para salvar a imagem basta apenas adicionarmos: FileUpload1.SaveAs("caminho_e_nome"), nesse caso para facilitar, vamos criar uma string para o caminho e nome do arquivo. Então a ação ficará como na Listagem 01.
string arquivo = Server.MapPath(FileUpload1.FileName);
FileUpload1.SaveAs(arquivo);
Listagem 01. Salvando arquivo
Agora que enviamos a imagem podemos abri-la e trabalhar com o ela o que for necessário, na parte superior desta página adicione:
using System.Drawing.Imaging;
Ótimo, já enviamos a imagem agora vamos criar a thumbnail, o primeiro passo será abrir a imagem enviada:
System.Drawing.Image abre_imagem = System.Drawing.Image.FromFile(arquivo); //Abre foto
Agora que ela está aberta podemos ver muitos dados dela, mas no momento só no interessa ver a altura e largura, para calcular a nova altura e largura proporcionalmente. Eu gosto de criar as thumbnails com a mesma altura então nesse caso vou deixar a altura máxima com 70px e a largura calcularemos em função disso, para fazer isso adicione a seguinte linha:
int largura = abre_imagem.Width * 70 / abre_imagem.Height; // calcula largura em proporção
O próximo passo será adicionar os códigos conforme a Listagem 02
System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = 
   new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image thumbNailImg = 
   abre_imagem.GetThumbnailImage(largura, 70, dummyCallBack, IntPtr.Zero); 
   //dados dentro dos parenteses: largura, altura...
//onde está "thumbnail.jpg" mude para o nome desejad para a thumbnail
thumbNailImg.Save(Server.MapPath("thumbnail.jpg")); 

//fechando conexoes
thumbNailImg.Dispose();
abre_imagem.Dispose();
Listagem 02. Trabalhando thumbnail
Para facilitar as explicações sobre a Listagem 02 eu adicionei nela alguns comentários, que facilitarão a compreenção.
Está quase tudo pronto, agora só falta adicionarmos a função para callback. Você irá adicioná-la fora da função LinkButton1_Click, o código completo de sua página ficará semelhante a Listagem 03:
using System.Drawing.Imaging;
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        string arquivo = Server.MapPath(FileUpload1.FileName);
        FileUpload1.SaveAs(arquivo);

		//Abre foto
        System.Drawing.Image abre_imagem = System.Drawing.Image.FromFile(arquivo); 

		// calcula largura em proporção
        int largura = abre_imagem.Width * 70 / abre_imagem.Height; 

        System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = 
		   new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
        System.Drawing.Image thumbNailImg = 
		   abre_imagem.GetThumbnailImage(largura, 70, dummyCallBack, IntPtr.Zero); 
		   //dados dentro dos parenteses: largura, altura...
        thumbNailImg.Save(Server.MapPath("thumbnail.jpg")); //salva thumbnail

        //fechando conexoes
        thumbNailImg.Dispose();
        abre_imagem.Dispose();

    }
    public bool ThumbnailCallback()
    {
        return false;
    }
}
Listagem 03. Página completa.
Escrevendo sobre imagens

Para escrever sobre a imagem é simples, adicione na parte superior de sua página:
using System.Drawing;
using System.Drawing.Drawing2D;
Para facilitar o entendimento, abaixo irei mostrar o código completo e comentá-lo. O código deverá ser adicionado depois da linha onde fechamos os objetos na criação das thumbnails.
Bitmap bmp = new Bitmap(arquivo); //Criando bitmap do arquivo
Graphics g = Graphics.FromImage(bmp); //Criando gráfico do arquivo

Rectangle treta = new Rectangle(0, bmp.Height / 2, bmp.Width, bmp.Height); 
//criando retangulo, os dados são na seguinte ordem:
//onde começa o texto(coloquei zero pois mando alinha ao centro na função abaixo), 
//altura do texto(coloquei no centro da imagem),
//largura do retangulo(a mesma largura da imagem), 
//altura do retangulo(a mesma altura da imagem)

StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center; //mandando o texto se alinhar ao centro
//Aqui vai o juntar o retangulo no Bitmap e escrever 
//sobre o retangulo, e formatar o texto
g.DrawString("Seu texto", new Font("tahoma",12), Brushes.White, treta, sf); 

//salvando imagem, altere para o nome desejado
bmp.Save(Server.MapPath("imagem_escrito.jpg")); 

//Fechando conexões
sf.Dispose();
bmp.Dispose();
g.Dispose();
Listagem 04. Escrevendo sobre imagens.
Pronto! Está tudo certo, pode rodar seu aplicativo e testá-lo.

Conclusão

Como vimos neste artigo, manipular imagens não é nenhum bicho de sete cabeças, desde que seja feita de uma forma bem organizada. Com os mesmos conceitos do que vimos hoje podemos, facilmente, fazer diversas coisas com imagens, como por exemplo, adicionar tarjas sobre as imagens, adicionar imagens sobre outras imagens, adicionar sombra no texto sobre a imagem e etc.

Espero ter ajudado e qualquer dúvida poste abaixo.
Gabriel dos Santos Potumati

Gabriel dos Santos Potumati - Trabalha na www.EquipeA.com.br e cursa Zootecnia na UFMS. Possue 7 anoes de experiência na área, sendo 1 em programação Asp.Net com C#. Tem conhecimentos em ASP e conhecimentos avançados em Flash e Photoshop. Alguns de seus trabalhos em programação ASP.NET: www.canaldoboi.com, www.coldline.com.br, www.bureautv.com.br, www.abrigodosbichos.com.br.