Desenvolvimento - ASP. NET

Marca d´agua em imagens usando System.Drawing

Neste artigo veremos como inserir uma marca d´agua em imagens (Texto + Logotipo), usando as classes disponíveis no namespace System.Drawing.

por Marcel Goldhardt



Muitas vezes, em nossos projetos Asp.Net, necessitamos fazer Upload de imagens para nossa aplicação. Me deparei em certas ocasiões, com a necessidade de manipular esta imagem (fotos), inserindo um logotipo personalizado e também algum texto (Copyright por exemplo).

O .Net Framework possui o namespace System.Drawing, que contém todas as classes necessárias para que possamos efetuar esta tarefa.

Foto Original

Alterada (Logotipo e Texto)

Nicolau.jpg

Nicolau.jpg

Para demonstrar esta funcionalidade, criei um novo projeto usando o Visual Studio 2008 (pode ser o 2005 sem problemas), inserindo os componentes FileUpload, Button e Image. O FileUpload servirá para o usuário escolher a foto original, o Button irá enviar o arquivo selecionado e chamar o método para inserir o logotipo e o texto, e por fim o componente Image irá exibir a imagem modificada.

Para deixar o projeto mais organizado, crie as pastas Imagens_Originais e Imagens_Alteradas. Agora basta codificar. O evento Click do Button:

protected void Button1_Click(object sender, EventArgs e)

        {

            if (FileUpload1.HasFile)

            {

                //Salva o arquivo na pasta Imagens_Originais

                FileUpload1.SaveAs(Server.MapPath("~/Imagens_Originais/") +  FileUpload1.FileName);

               

                //Chama o método que vai inserir o logotipo na imagem original

                InsereMarca(FileUpload1.FileName);

            }

        }

O código acima, primeiramente verifica se há algum arquivo selecionado no FileUpload. Caso contenha, salva o mesmo na pasta Imagens_Originais, e imediatamente chama o método que irá manipular nossa imagem, passando como parâmetro o nome do arquivo recém salvo. Obviamente, caso você pense em colocar isso em produção, sugiro que algumas validações sejam feitas, como: verificação do tipo de arquivo, checar se ele já existe, tamanho máximo, etc.

Agora, criamos o método que irá fazer o trabalho de inserção do logotipo e do texto em nossa imagem:

protected void InsereMarca(string _filename)

        {

            //Mapeamento do arquivo enviado via upload

            string original = Server.MapPath("~/Imagens_Originais/" + _filename);

           

            //Mapeamento do arquivo do logotipo

            string logotipo = Server.MapPath("~/logotipo.jpg");

           

            //Criação dos objetos utilizando a classe Image

            //com os arquivo original e o logotipo

      System.Drawing.Image imagem =

System.Drawing.Image.FromFile(original);

            System.Drawing.Image logo = System.Drawing.Image.FromFile(logotipo);

           

            //Criação do objeto com a classe Graphics, para manipulação da imagem

System.Drawing.Graphics gr =     System.Drawing.Graphics.FromImage(imagem);

           

            //Inserção do logotipo objeto gr(imagem original)

//passando como parâmetro os pontos iniciais X/Y e o tamanho do //logotipo

            gr.DrawImage(logo, 10, 10, logo.Width, logo.Height);

            //Inserção de texto na imagem

            //Escolha da fonte (familia, tamanho, negrito, un.medida(pixels)

System.Drawing.Font fonte = new System.Drawing.Font("Tahoma", 10, System.Drawing.FontStyle.Bold, GraphicsUnit.Pixel);

          

//Desenhando (Texto, objeto fone, pincel e posicionamento)

gr.DrawString("Marca d´agua usando System.Drawing", fonte, System.Drawing.Brushes.Azure, 1, imagem.Height - 35);

            //Mapeamento e salvamento da imagem na pasta Imagens_Alteradas

            //É necessario informar o formato, nesse caso JPG

string novoarquivo = Server.MapPath("~/Imagens_Alteradas/") + _filename;

           

imagem.Save(novoarquivo, System.Drawing.Imaging.ImageFormat.Jpeg);

            //Mostra a nova imagem salva no componente Image1

            Image1.ImageUrl = "~/Imagens_Alteradas/" + _filename;

        }

    }

O logotipo que estou inserindo foi definido previamente, e salvo na raiz do projeto. Neste projeto, tomei por base que sempre a imagem original irá ter a resolução de 640 x 480. Obviamente que no dia-a-dia as imagens terão tamanho variado, sendo necessário implementar uma lógica que redimensione estas ou que faça a inserção do logo proporcional ao tamanho da imagem.

modif.jpg

O código fonte deste projeto pode ser baixado em: http://www.goldhardt.com.br/file.axd?file=2009%2f11%2fMarcaDAgua.zip

Dúvidas e sugestões fique a vontade em me contatar: marcel@dataum.com.br ou visite meu blog em www.goldhardt.com.br

Até a próxima.

Marcel Goldhardt

Marcel Goldhardt