Desenvolvimento - ASP. NET

Adicionando CopyRight e redimensionando imagens com ASP.NET

Como desenvolvedor de sites comerciais, frequentemente me deparei com a necessidade de gerar copyright nas imagens e fotos dos sites. O Namespace System.Drawing do .NET Framework permite manipular imagens com muita facilidade e há muitos recursos para isso.

por Rodrigo Glauser



Como desenvolvedor de sites comerciais, frequentemente me deparei com a necessidade de gerar copyright nas imagens e fotos dos sites. Todo mundo sabe quanto trabalho dá para o administradorde um site gerar seu próprio conteúdo e vê-lo sendo"roubado" porconcorrentesé no mínimo desanimador.

O Namespace System.Drawing do .NET Framework permite manipular imagens com muita facilidade e há muitos recursos para isso, éimpressionante o que podemos fazer agora com o .NETFramework o que não conseguíamos facilmente no ASP 3.0 por exemplo.

Neste artigo mostrarei comosobrepor esta imagem:

no canto superior esquerdo desta outra:

Produzindo a seguinte saída:

Além da sobreposição irei mostrar como se faz o redimensionamento OnTheFly de ambas imagens interpoladas produzindo uma imagem final em qualquer dimensão sem o utilizar ométodo GetThumbnailImage() que em meus testes apresentou uma qualidade final das imagens muito ruim.

1º Passo - Criar a Solução ASP.NET

Crie um projeto Visual Basic -> ASP.NETWeb Application chamado GerarCopyRight. Não há problema em usar um projeto já existente, fica a seu critério.

Adicione um WebForm chamado foto.aspx e crie uma subpasta ao projeto chamado imagens onde ficarão as imagens que iremos tratar. Na pasta Imagens coloque uma imagem chamada marca.gif que conterá a Marca do CopyRight. Coloque também todas as imagens que desejar que tenham a marca sobreposta.

2ª Passo - Código Comentado

Abra a página foto.aspx em modo código e faça a importação dos seguintes namespaces:System.Drawinge System.Drawing.Drawing2D

No método Page_Load da página insira o seguinte código:

Private Sub Page_Load(ByVal sender As System.Object, 
ByVal e As System.EventArgs)Handles MyBase.Load Dim nomePasta As String = Server.MapPath("imagens\") Dim nomeArquivo As String = Request.QueryString("nomeArquivo") Dim nomeArquivoMarca = Server.MapPath("imagens\marca.gif") Dim tamanho As Double = Request.QueryString("tamanho") GerarCopyRight(nomePasta, nomeArquivo, nomeArquivoMarca, tamanho) End Sub

Notem que 2 parâmetros deverão ser passados por QueryString: O Nome do Arquivo e o Tamanho em Pixels final da Imagem.

Neste bloco abaixoestá oMétodo GerarCopyRight que irá fazer o processamento da Imagem . Como padrão utilizei a palavra Final para me referir aos objetos que se referem à imagem redimensionada.

Private Sub GerarCopyRight(ByVal nomePasta As String, _
ByVal nomeArquivo As String, ByVal nomeArquivoMarca As String, _
ByVal tamanho As Double)
Dim
tamanhoFinal, alturaFinal As Integer Dim dimensaoFinal As Size Dim oImg As System.Drawing.Image Dim oImgFinal As System.Drawing.Image
" Objetos Image que conterão a imagem original e redimensionada respectivamente.

Verificamos abaixo sea figura realmente existe no local informado. Uma boa prática é de colocar uma figura em branco ou com alguma mensagem dizendo que a imagem solicitada não foi encontrada.

If IO.File.Exists(nomePasta & nomeArquivo) Then 
    oImg = Image.FromFile(nomePasta & nomeArquivo) 
Else 
    " oImg = Image.FromFile(nomePasta & "NaoDisponivel.jpg") 
    " Aqui você pode colocar uma figura dizendo "Imagem Não Disponível" 
End If
						

Aqui determinamos o comprimento e largura em pixels da imagem final que será exibida. Se não for passado nenhum valor para o parâmetroQueryString tamanho então a imagem Final não sofre redimensionamento.

If tamanho = 0 Then 
   tamanhoFinal = oImg.Width 
   alturaFinal = oImg.Height 
Else 
   tamanhoFinal = tamanho 
   alturaFinal = oImg.Height / (oImg.Width / tamanhoFinal) 
End If
						

Instanciamos o objeto Size com as dimensões finais da figura:

dimensaoFinal = New Size(tamanhoFinal, alturaFinal) 
						

Abaixo Instanciamos o Objeto oImgFinal para termos um objeto image em branco com as dimensões da imagem Final. Com o objeto oImgFinal instanciamos o objeto oGraphic da classe Graphic onde as imagens serão interpoladas e redimensionadas.

oImgFinal = New Bitmap(dimensaoFinal.Width, dimensaoFinal.Height, _ 
oImg.PixelFormat) Dim oGraphic As Graphics = Graphics.FromImage(oImgFinal)
"Alteramos algumas propriedades do objeto oGraphic para melhorar
"a qualidade final da imagem.
oGraphic.CompositingQuality = CompositingQuality.HighQuality oGraphic.SmoothingMode = SmoothingMode.HighQuality oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic

Instanciamos um objeto Retângulo que contém as coordenadas x e y e as dimensões width , height. Com estas informações de posicionamento interpolamos a primeira imagem (oImg) ao objeto oGraphic já redimensionada.

Dim oRectangle As Rectangle = New Rectangle(0, 0, _
dimensaoFinal.Width, dimensaoFinal.Height) oGraphic.DrawImage(oImg, oRectangle)

O código abaixo é o que interpola a imagem de CopyRight ao objeto oGraphic. Na primeira linha fazemos a verificação de existencia da imagem de CopyRight no servidore também colocamos um tamanho mínimo para a inserção da marca, isto porque imagens pequenas normalmente não necessitam de proteção. A Constante proporcao determina quantas vezes a imagem de copyright será menor que a imagem redimensionada. E por final interpolamos a imagem com a marca de Copyright ao oGraphic com base nas coordenadas informadas pelo objeto oRectangleLogo. Se você desejar que a imagem seja sobreposta em outra posição altere o x e y do oRectangleLogo.
Obs. A imagem de Copyright pode ser em formato png, jpg, gif e pode conter transparência.

If dimensaoFinal.Width > 250 And IO.File.Exists(nomeArquivoMarca) Then 
  Dim oImgMarca As Image 
  Dim tamanhoMarca, alturaMarca As Double 
  Const proporcao As Double = 4.5 
  oImgMarca = System.Drawing.Image.FromFile(nomeArquivoMarca) 
  tamanhoMarca = dimensaoFinal.Width / proporcao 
  alturaMarca = (oImgMarca.Height / oImgMarca.Width) _ 
* (dimensaoFinal.Width / proporcao) " Interpola a imagem no canto inferior direito " Dim oRectangleLogo As Rectangle = New Rectangle( _
" dimensaoFinal.Width - tamanhoMarca, _
" dimensaoFinal.Height - alturaMarca, _
" tamanhoMarca, alturaMarca)
" Interpola a Imagem no canto superir esquerdo Dim oRectangleLogo As Rectangle = New Rectangle(0, 0, tamanhoMarca, _
alturaMarca) oGraphic.DrawImage(oImgMarca, oRectangleLogo) End If "E por fim produzimos a saída da página como uma imagem JPG. Response.ContentType = "image/jpeg" oImgFinal.Save(Response.OutputStream, Imaging.ImageFormat.Jpeg) oImg.Dispose() oImgFinal.Dispose() End Sub

Para testar a página abra seu navegador e digite http://localhost/GerarCopyRight/foto.aspx?nomeArquivo=ImagemOriginal.jpg&tamanho= 300
Altere os parâmetros ( Nome do Arquivo e Tamanho ) e perceba as alterações ocorridas na imagem. Outras configurações como nome da pasta, nome do arquivo com o copyright, proporção, etc... poderiam ser mantidas no web.config ou passadas por QueryString também.

Para mostrar as imagens produzidas OnTheFly em outras páginas é só informar a url no src da Tag Img ou ImageUrl da Tag <asp:Image

img border=0 src="http://localhost/GerarCopyRight
/foto.aspx?nomeArquivo=ImagemOriginal.jpg&tamanho=300"
>

O Namespace System.Drawing é o que particularmente eu mais gosto. É possível fazer coisas inimagináveis com ele. Espero que possa ter ajudado alguém com este artigo e até a próxima com mais ASP.NET.

Faça o download da solução. Clique aqui.

Rodrigo Glauser

Rodrigo Glauser - É líder do Grupo de Usuários Gup.NET Ponta Grossa/PR, desenvolvedor coorporativo da Masisa do Brasil LTDA, trabalha atualmente em um projeto de integração .NET e SAP em filiais da empresa localizadas no Brasil, Argentina, Chile, Venezuela e México, trabalha com .NET há 2 anos e com programação web há 4 anos. Também concentra esforços em soluções para internet na solucoesweb.com.
The Spoke:
http://br.thespoke.net/MyBlog/rglauser/MyBlog.aspx