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 GoldhardtMuitas 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) |
|
|
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.
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.