none
Cambiar tamaño de imgen RRS feed

  • Pregunta

  • Hola,

    en una aplicacion que realizo con vs 2008 en vb subo imagenes al servidor con un fileupload y necesito cambiar el tamaño sin perder la relacion de aspecto. ¿ me podrian orientar sobre como hacerlo ?  Gracias..

    martes, 26 de octubre de 2010 10:39

Respuestas

  • Hola

     

    Tambien va otro codigo ;)

    ...que es una funcion estatica.. colocala dentro de una clase que te ayude en tu aplicacion

     

    Public Shared Function Redimensionar(imagen As Image, ancho As Integer, alto As Integer) As Image
    
    	If imagen.Width > imagen.Height Then
    		alto = imagen.Height * ancho / imagen.Width
    	Else
    		ancho = imagen.Width * alto / imagen.Height
    	End If
    
    	Dim imagenPhoto As Image = imagen
    
    
    	Dim bmPhoto As New Bitmap(ancho, alto, PixelFormat.Format24bppRgb)
    	bmPhoto.SetResolution(72, 72)
    	Dim grPhoto As Graphics = Graphics.FromImage(bmPhoto)
    	grPhoto.SmoothingMode = SmoothingMode.AntiAlias
    	grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic
    	grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality
    	grPhoto.DrawImage(imagenPhoto, New Rectangle(0, 0, ancho, alto), 0, 0, imagen.Width, imagen.Height, _
    		GraphicsUnit.Pixel)
    
    	Dim mm As New MemoryStream()
    	bmPhoto.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg)
    	imagen.Dispose()
    	imagenPhoto.Dispose()
    	bmPhoto.Dispose()
    	grPhoto.Dispose()
    	Return ByteArrayToImage(mm.GetBuffer())
    End Function
    
    
    Public Shared Function ByteArrayToImage(arregloDeBytes As Byte()) As Image
    	Dim ms As New MemoryStream(arregloDeBytes)
    	Dim imagen As Image = Image.FromStream(ms)
    	Return imagen
    End Function
    
    Pero si quieres algo para manipular los Thumbnail de tu app web te convendría lo que comenta Mauricio. Donde creo que la salida siempre es jpg (por eso es un metodo exlusivo para realizar imagenes en miniatura)


    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
    jueves, 28 de octubre de 2010 20:48

Todas las respuestas

  • hola

    una vez que se suba la foto al servidor web, podrias guardarla en un archivo, y luego aplciar lo comentado en este articulo

    Resizing a Photographic image with GDI+ for .NET

    para cambiar el tamaño

    no ash especificado en que lenguaje trabajas pero si se trata de vb.net podrias convertir usando estas tools

     

    Convert C# to VB.NET

    Code Converter

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 26 de octubre de 2010 11:56
  • Hola

    ¿ Has podido solucionar tu problema ?

    Saludos
    Eduardo Portescheller
    jueves, 28 de octubre de 2010 17:06
    Moderador
  • esto utilizo yo para cambiar de tamaño las imagenes:

     Dim filename As String = FileUpload1.FileName
                        ' Cree un mapa de bits del contenido del control de fileUpload en la memoria
                        Dim originalBMP As Bitmap = New Bitmap(FileUpload1.FileContent)
                        ' Calcule las nuevas dimensiones de imagen
                        Dim origWidth As Integer = originalBMP.Width
                        Dim origHeight As Integer = originalBMP.Height
                        Dim sngRatio As Integer = origWidth \ origHeight
                        Dim newWidth As Integer = 100
                        Dim newHeight As Integer = newWidth \ sngRatio
                        ' Cree un nuevo mapa de bits que sostendrá el mapa de bits anterior redimensionado
                        Dim newBMP As New Bitmap(originalBMP, newWidth, newHeight)
                        ' Cree un gráfico basado en el nuevo mapa de bits
                        Dim oGraphics As Graphics = Graphics.FromImage(newBMP)
                        ' Ponga las propiedades para el nuevo archivo gráfico
                        oGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
                        oGraphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
                        ' Dibuje el nuevo gráfico basado en el mapa de bits redimensionado
                        oGraphics.DrawImage(originalBMP, 0, 0, newWidth, newHeight)
                        ' Guearde el nuevo archivo gráfico al servidor
                        newBMP.Save("C:\Tesis\images\" & FileUpload1.FileName)
                        ' Una vez terminado con los objetos de mapa de bits, los desasignamos.
                        originalBMP.Dispose()
                        newBMP.Dispose()
                        oGraphics.Dispose()

    • Propuesto como respuesta Boniso jueves, 15 de marzo de 2012 1:39
    jueves, 28 de octubre de 2010 17:54
  • Hola, si no necesitas algo muy sofisticado, intenta con éste método, a mí me funciona muy bien :

        private Image zoomImage(Image LaImagen, double Factor)
        {
          Image.GetThumbnailImageAbort callback = new Image.GetThumbnailImageAbort(this.ThumbnailCallback);
          return LaImagen.GetThumbnailImage((int) (LaImagen.Width * Factor), (int) (LaImagen.Height * Factor), callback, IntPtr.Zero);
        }
    

    Le puedes doblar el tamaño, así como colocarlo en la mitad sin ningún problema, el parámetro de Factor debe ser un valor como : 0.5 ( a la mitad), 2 (el doble), etc.

    Cordial saludo,


    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    jueves, 28 de octubre de 2010 20:03
  • Hola

     

    Tambien va otro codigo ;)

    ...que es una funcion estatica.. colocala dentro de una clase que te ayude en tu aplicacion

     

    Public Shared Function Redimensionar(imagen As Image, ancho As Integer, alto As Integer) As Image
    
    	If imagen.Width > imagen.Height Then
    		alto = imagen.Height * ancho / imagen.Width
    	Else
    		ancho = imagen.Width * alto / imagen.Height
    	End If
    
    	Dim imagenPhoto As Image = imagen
    
    
    	Dim bmPhoto As New Bitmap(ancho, alto, PixelFormat.Format24bppRgb)
    	bmPhoto.SetResolution(72, 72)
    	Dim grPhoto As Graphics = Graphics.FromImage(bmPhoto)
    	grPhoto.SmoothingMode = SmoothingMode.AntiAlias
    	grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic
    	grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality
    	grPhoto.DrawImage(imagenPhoto, New Rectangle(0, 0, ancho, alto), 0, 0, imagen.Width, imagen.Height, _
    		GraphicsUnit.Pixel)
    
    	Dim mm As New MemoryStream()
    	bmPhoto.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg)
    	imagen.Dispose()
    	imagenPhoto.Dispose()
    	bmPhoto.Dispose()
    	grPhoto.Dispose()
    	Return ByteArrayToImage(mm.GetBuffer())
    End Function
    
    
    Public Shared Function ByteArrayToImage(arregloDeBytes As Byte()) As Image
    	Dim ms As New MemoryStream(arregloDeBytes)
    	Dim imagen As Image = Image.FromStream(ms)
    	Return imagen
    End Function
    
    Pero si quieres algo para manipular los Thumbnail de tu app web te convendría lo que comenta Mauricio. Donde creo que la salida siempre es jpg (por eso es un metodo exlusivo para realizar imagenes en miniatura)


    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja
    jueves, 28 de octubre de 2010 20:48
  • Ahm hola buenas señores, quisiera saber si el mismo codigo me sirve para win32, aparte quisiera saber:

    como hacer para que cuando se elija la imagen mediante un OPENDIALOGFILE, la ruta de la imagen seleccionada y lo que quiero es hacer que se guarde en una carpeta que yo especifique y/o redimensionarla, no se si debo guardar o redimensionar primero, la cosa es que necesito tambien saber la nueva ruta de la magen guardada, ahora quiero saber la ruta pero con el nombre de la imagen.

    Aunque la logica seria primero Guardarla y luego redimensionarla, pero bueno no se como aria eso.

    Espero me puedan ayudar.

    miércoles, 19 de enero de 2011 0:01
  • Muchas gracias. Tu solución me ha sido de gran ayuda.
    jueves, 15 de marzo de 2012 1:39