Siguiendo con la manipulación de imágenes en .NET, imaginemos que disponemos de una imagen de un tamaño considerable, bien en disco, bien en base de datos, y queremos enviarle al usuario un thumbnail de dicha imagen. ¡Ojo! No queremos mostrar la imagen completa con un estilo que modifique su alto y ancho, ya que con esto estaríamos enviando la imagen completa y luego modificaríamos su visualización en cliente, perdiendo el correspondiente (y valioso) ancho de banda.
En lugar de esto, sacrificaremos unos cuantos ciclos de CPU en pos de limitar el tráfico y realizaremos la operación de redimensionar la imagen en servidor para posteriormente enviarsela (más pequeñita o más grande) al cliente.
Para ello, nos crearemos una función llamada RedimensionarImagen que reciba tres parámetros: la imagen que queremos redimensionar, la nueva altura y la nueva anchura:
private System.Drawing.Bitmap RedimensionarImagen(System.Drawing.Image imagenOriginal, int alto, int ancho) {
Lo primero que haremos será guardar el alto y el ancho de la imagen original.
int anchoOriginal = imagenOriginal.Width; int altoOriginal = imagenOriginal.Height;
A continuación declaramos dos variables de tipo float que almacenaran el porcentaje de escalado al que se va a ver sometida la imagen.
float porcentajeEscaladoX = (float)ancho / (float)anchoOriginal; float porcentajeEscaladoY = (float)alto / (float)altoOriginal;
El siguiente paso será definir una nueva altura para la imagen, multiplicando los valores originales por los factores que hemos obtenido en el paso anterior.
int nuevoAncho = (int)(anchoOriginal * porcentajeEscaladoX); int nuevoAlto = (int)(altoOriginal * porcentajeEscaladoY);
Ya tenemos las dimensiones de nuestra nueva imagen, ahora necesitaremos crear una instancia.
System.Drawing.Bitmap nuevaImagen = new System.Drawing.Bitmap(nuevoAncho, nuevoAlto);
Ahora instanciamos una superficie de dibujo de GDI+ a partir de la imagen para tratar el tamaño.
System.Drawing.Graphics superficieGDI = System.Drawing.Graphics.FromImage((System.Drawing.Image)nuevaImagen);
Indicamos el modo de interpolación (en nuestro caso, Bicúbico Alta Calidad) y dibujamos la imagen con los nuevos valores de ancho y alto.
superficieGDI.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; superficieGDI.DrawImage(imagenOriginal, 0, 0, nuevoAncho, nuevoAlto);
Finalmente, liberamos el objeto GDI+ y devolvemos la imagen.
superficieGDI.Dispose(); return nuevaImagen; }
Et voilà!, hecho esto, obtendremos una imagen con el alto y ancho deseados.