Por Rodrigo Glauser
rsglauser@hotmail.com
É 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

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. Todo mundo sabe quanto trabalho dá para o administrador de um site gerar seu próprio conteúdo e vê-lo sendo "roubado" por concorrentes é 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 .NET Framework o que não conseguíamos facilmente no ASP 3.0 por exemplo.

Neste artigo mostrarei como sobrepor 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 o mé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.NET Web 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.Drawing e 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 abaixo está o Mé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 se a 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âmetro QueryString 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 servidor e 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.
Dicas para quem está começando:
Veja os próximos eventos
que você não pode perder :

22/11/2008 SQL Launch -
Linhares - ES
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Rio Paranaiba - Viçosa - MG
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Volta Redonda - RJ
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Franca - SP
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Canoinhas - SC
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Tefé - AM
Por : devASPNet


25/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


27/11/2008 SQL Lauch- SQL Server 2008
São Paulo - SP
Por : devASPNet


28/11/2008 SQL Launch - SQL Server 2008
São Paulo - SP
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Pedro Leopoldo - MG
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Petropolis - RJ
Por : devASPNet


29/11/2008 SQL Launch
Floriano - PI
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Natal - RN
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Santa Maria - RS
Por : devASPNet


29/11/2008 SQL Launch
Ituiutaba - MG
Por : devASPNet


5/12/2008 Cloud Computing e o Windows Azure
São Paulo - SP
Por : devASPNet


6/12/2008 SQL Server 2008 Community Launch
São Paulo - SP
Por : devASPNet

Leituras imperdíveis para quem está começando:

º Otimizando a performance no ASP.NET::..
º Criando objetos de paginação personalizados na grid::..
º Uma cesta de compras em ASP.NET::..
º Utilizando o Refresh de parâmetros no .NET::..
º ASP.NET FORMS Authentication::..
º Utilizando propriedades dinâmicas no .NET::..
º Corrigindo problemas de deleção em grid com paginação::..
º Cuidado com os componentes de validação::..
º Otimizando o InitializeComponent::..
º Movendo fonte de aplicações entre máquinas::..
º Agilizando a performance da IDE do VS.NET::..
º Utilizando Short Circuit no VB.NET::..


























  Parceiros:
20% de desconto para os membros do grupo na aquisição de livros e inscrição para eventos

Receba dicas de programação e programação .NET:
E-mail:
Incluir Excluir