martes, 5 de febrero de 2013

Tratamiento de imágenes (Parte VIII). Redimensionar un bitmap con InterpolationMode.

En esta entrada, vamos a tratar el tema de cómo redimensionar un bitmap en Visual Basic .NET. Hay varias formas, desde la más simple que es creando un nuevo bitmap con las dimensiones que queramos, hasta la opción de utilizar el método InterpolationMode que nos permite seleccionar entre varios tipos de interpolación.

  • Redimensionamiento simple
La primera forma y más sencilla, partiendo de una imagen en un Picturebox, sería así:

'Creamos un bitmap con la imagen original
Dim bmp As New Bitmap(PictureBox1.Image) 
'Creamos otro bitmap con la mitad del tamaño
PictureBox2.Image = New Bitmap(bmp, bmp.Width / 2, bmp.Height / 2) 
La imagen se muestra a continuación:

Ejemplo de redimensión simple

  • Redimensionamiento interpolado

Ahora vamos a ver lo interesante; cómo definir la interpolación. Para ello creamos una función con el siguiente código:


   Private Function Interpola(ByVal bmp As Bitmap, ByVal tamañoImagen As System.Drawing.Rectangle, Optional ByVal interpolación As Drawing2D.InterpolationMode = 0) As Bitmap
        'Creamos un bitmap nuevo
        Dim bmp2 As New Bitmap(bmp)
        'Creamos un bitmap con el tamaño que hemos proporcionado con tamañoImagen
        Dim bmp3 As New Bitmap(tamañoImagen.Width, tamañoImagen.Height)
        'Creamos objeto graphics con el bitmap creado (bmp3)
        Dim G As Graphics = Graphics.FromImage(bmp3)
        'Seleccionamos el tipo de interpolación
        G.InterpolationMode = interpolación
        'Dibujamos con la imagen original bmp2, el tamaño proporcionado por tamañoImagen
        'Un rectángulo que ocupe toda la imagen original y como unidad el píxel
        G.DrawImage(bmp2, tamañoImagen, New Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel)
        'Devolvemos el resultado
        Return bmp3
    End Function
Y para llamar a la función lo haríamos de la siguiente forma:
   
'Interpolación HighQualityBicubic de la mitad de la imagen original
PictureBox2.Image = Interpola(bmp, New Rectangle(0, 0, bmp.Width / 2, bmp.Height / 2),Drawing2D.InterpolationMode.HighQualityBicubic)

Y quedaría algo así:

Redimensionada con HighQualityBicubic

Como vemos es muy sencillo y las diferencias son notables. A continuación os voy a enumerar los diferentes tipos de interpolaciones:
  1. Default: especifica el modo predeterminado.
  2. Low: especifica interpolación de calidad baja.
  3. High: especifica interpolación de calidad alta.
  4. Bilinear: especifica interpolación bilineal.No se ha aplicado ningún filtro previo.Este modo no es adecuado para comprimir una imagen hasta por debajo de un 50% de su tamaño original.
  5. Bicubic: especifica interpolación bicúbica.No se ha aplicado ningún filtro previo.Este modo no es adecuado para comprimir una imagen hasta por debajo de un 25% de su tamaño original.
  6. NearestNeighbor: especifica interpolación de elemento más cercano.
  7. HighQualityBilinear: especifica una interpolación bilineal de gran calidad.Se aplica un filtro previo para garantizar una compresión de gran calidad.
  8. HighQualityBicubic: especifica una interpolación bicúbica de gran calidad.Se aplica un filtro previo para garantizar una compresión de gran calidad.Este modo genera imágenes transformadas de la más alta calidad.
Descarga el código fuente completo:

1 comentario: