Desenvolvimento - Visual Basic .NET

Manipulando o Tamanho de imagens em .NET

Manipulando o tamanho de imagens durante a execução e mantendo a proporção sem ter que manter salva uma cópia reduzida da imagem original...

por Fernando Cerqueira



Recentemente precisei manipular imagens em um determinado website. A principal dificuldade encontrada foi que as imagens poderiam não seguir um tamanho padrão, pois ficaria a cargo dos usuários publicar as imagens...

Sempre me surpreendo com as facilidades encontradas dentro do .NET , e novamente tive a felicidade de encontrar mais uma : Thumbnail de imagens usando o System.Drawing.

A rotina abaixo tem como objetivo apresentar uma imagem dentro de um limite pré-estabelecido, porém mantendo as proporções originais da figura original.

Optamos por realizar esta tarefa "on fly", pois a quantidade de imagens seria muito pequena por vez, e não teríamos que nos preocupar em manter 2 versões de imagens, que seria preciso em outros casos com maior quantidade (visando aumentar a performance), desta forma a imagem reduzida é gerada via uma stream em memória e apresentada durante a montagem da página sem salvar o resultado da redução. Para isso criamos uma página sem nada e durante o evento load executamos a conversão e retornarmos a imagem reduzida informando pelo ContentType que se trata de um arquivo de imagem.

A rotina consiste em 3 três etapas:

  • Receber os parâmetros da imagem - Path físico do arquivo original, Largura e Altura máxima permitidas.
  • Ler as informações da Imagem - Dimensões para executar os cálculos de redução de tamanho mantendo o aspecto.
  • Gerar a imagem e retornar seu conteúdo - informando o tipo de retorno para o browser cliente.

Receber os parâmetros da imagem

Dim FileName As String = Request("img")         
Dim MaxH As Integer = CType(Request("maxH"), Integer)        
Dim MaxW As Integer = CType(Request("maxW"), Integer)

Lemos 3 parâmetros passados para página. Um exemplo de como esta página seria passada :

ImgHome.ImageUrl = "Thumbnail.aspx?img=c:\imagens\logo.gif&MaxW=100&MaxH=100"

Ler as informações da Imagem

Dim OriImg As System.Drawing.Image
OriImg = OriImg.FromFile(FileName)
If OriImg.Width> OriImg.Width Then
	"Padrão Paisagem
	If OriImg.Width> MaxW Then
		MaxW = OriImg.Width
		maxH = Convert.ToInt32(OriImg.Height * MaxW / OriImg.Width)
	Else		
		MaxW = OriImg.Width		
		MaxH = OriImg.Height	
	End if        
Else    	
	"Padrão Retrato		
	If OriImg.Height> MaxH Then
		MaxH = OriImg. Height
		maxW = Convert.ToInt32(OriImg. Width * MaxW / OriImg. Height)
	Else
		MaxW = OriImg.Width	
		MaxH = OriImg.Height
	End if 
End if

Aqui instanciamos um objeto Image e obtemos a imagem pelo método FromFile. Depois de acordo com o padrão de apresentação executamos o cálculo de redução proporcional dentro dos limites máximos passados como parâmetros.

Gerar a imagem e retornar seu conteúdo

	OriImg = OriImg.GetThumbnailImage(MaxW, MaxH, New 
System.Drawing.Image.GetThumbnailImageAbort(AddressOf MyCallbackDelegate),
System.IntPtr.Zero)        
	Dim MS As System.IO.MemoryStream = New System.IO.MemoryStream        
	Img.Save(MS, System.Drawing.Imaging.ImageFormat.Jpeg)        
	Dim MsAr As Byte() = MS.ToArray()        
	Response.ContentType = "image/Jpeg"        
	Response.BinaryWrite(MsAr)
Finalmente geramos a imagem reduzida pelo método GetThumbnailImage. Esta imagem é salva em uma stream de memória no mesmo formato de retorno. Para devolver precisamos converter a imagem em um tipo Byte() para ser usado pelo método do BinaryWrite do objeto response, juntamente com a propriedade ContentType que informa o tipo de conteúdo esta sendo retornado.

Função Delegate para uso do GetThumbmailImage

    Public Function MyCallbackDelegate() As Boolean
    	Return False
    End Function
Esta função é necessária para a função GetThumbnailImage que exige que exista um delegate do tipo GetThumbnailImageAbort.

Implementação

Para implementar basta copiar todo o código em destaque e colocar no evento load e a função MyCallbackDelegate para um formulário vazio.

A Chamada devera ser feita para propriedade de qualquer objeto que receba um path de imagem.

Sobre o Autor: Fernando Cerqueira - Analista de Sistemas, tendo trabalhado em empresas de todos portes. Atualmente é Consultor e diretor da FCI (www.fci.com.br), DEVELOPER por vocação, ministrando palestras e atuando em soluções personalizadas na plataforma .NET para diversas empresas. E-mail de Contato: fernandocerqueira@msn.com

Fernando Cerqueira

Fernando Cerqueira - Microsoft Most Valuable Professional em ASP.NET 2004 – 2005 – 2006 . Possui formação Acadêmica em Administração de empresas, especialista em Call Center , BI e CRM. Atuou em diversas empresas de grande porte, sempre utilizando a plataforma Microsoft. Desde 2002 vem trabalhando com o Visual Studio .NET prestando consultoria e treinamento focando os resultados em ASP.NET. Em 2003, criou o GURJ.NET - Grupo de usuários .NET do Rio de Janeiro sendo reconhecido pelo INETA. Hoje voluntariamente dedica parte de seu tempo no comitê de Web e Infra da INETA Brasil. Atualmente, como profissional, presta serviços exclusivamente na plataforma Microsoft.NET atuando como arquiteto de sistemas em diversos projetos de porte nos estados do RJ, SP e MG.