sexta-feira, 16 de outubro de 2009

Redimensionando imagens sem perder qualidade

Fala, galera!!

Segue um código útil para quem precisa trabalhar com imagens em uma aplicação .Net.

O código abaixo utiliza a classe Drawing para redimensionar imagens sem perder a qualidade.


Sub Redimensionar(ByVal CaminhoImagem As String, Optional ByVal MaxLargura As Integer = 0, Optional ByVal MaxAltura As Integer = 0)

        Dim Arquivo As String = CaminhoImagem
        Dim MaxH As Integer = MaxAltura
        Dim MaxW As Integer = MaxLargura
        Dim pageContext As System.Web.HttpContext
        pageContext = System.Web.HttpContext.Current

        Dim OriImg As System.Drawing.Image
        OriImg = Image.FromFile(CaminhoImagem)


        If OriImg.Width > OriImg.Height Then
            'Padrão Paisagem
            If OriImg.Width > MaxW Then
                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

        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
        OriImg.Save(MS, System.Drawing.Imaging.ImageFormat.Jpeg)
        Dim MsAr As Byte() = MS.ToArray()
        pageContext.Response.ContentType = "image/Jpeg"
        pageContext.Response.BinaryWrite(MsAr)

    End Sub
    Private Function MyCallbackDelegate() As Boolean
        Return False
    End Function

É necessário importar o namespace System.Drawing

Um abraço e até a próxima!!

2 comentários:

  1. Amigo, eu utilizei este seu código e funcionou perfeitamente. O meu único problema com ele é que ao invés de limpar a página corrente e mostrar somente a imagem redimensionada eu gostaria de carregar esta imagem num componente image que existe na minha tela. Você sabe me dizer se isto é possível?
    Obrigado!
    Arnaldo.

    ResponderExcluir
  2. Olá amigo,

    Desculpe a demora.

    Você pode criar uma página aspx que renderiza a imagem e passá-la como parâmetro no seu componente de imagem.

    Exemplo:

    img src="resize.aspx?file=c:/imagem.jpg"
    ou
    asp:Image imageUrl="resize.aspx?file=c:/imagem.jpg"

    Espero ter ajudado!

    Abraços!

    ResponderExcluir