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 CerqueiraSempre 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 FunctionEsta 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
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET