12 diciembre 2012

Redimensionando Imágenes con PHP y GD

Una de las tareas más comunes a la hora de desarrollar aplicaciones web, es la de redimensionar las imágenes que envían los usuarios.

PHP a través de la extensión GD, provee de una serie de funciones que nos facilitan este trabajo. En esta entrada explicaré un sencillo algoritmo para redimensionar manteniendo el aspecto, es decir redimensionar una imágen sin que esta se deforme.

El problema: Imaginemos que ustedes han creado una super-aplicación que va a sacar a Flickr fuera de línea. Sin embargo todos sus usuarios están enviandoles fotografías de 10Mpx. ¿Como hacer para generar los thumbnails y versiones en distintos tamaños desde php?

La siguiente función se encarga de redimensionar una imágen manteniendo el ancho y alto dentro de los límites especificados. Así si nuestra imagen original tiene 1600x1200 de tamaño y especificamos 800x800 en los parámetros la imagen redimensionada resultante tendrá 800x600.

function resizeImage($originalImage,$toWidth,$toHeight){
  /* Esta función redimensiona un archivo JPG manteniendo
   * su radio de aspecto original dentro de los límites
   * $toWidth y $toHeight.
   * Parámetros:
   * $originalImage: Nombre del archivo en formato JPG
   * a redimensionar.
   * $toWidth: Ancho máximo de la imágen redimensionada.
   * $toHeight: Alto máximo de la imágen redimensionada.
   * Devuelve una imágen en memoria con las proporciones
   * correctas.
   */
  
  list($width, $height) = getimagesize($originalImage);
  
  // Obtenemos la relación de tamaño respecto
  // al ancho y alto máximo.
  $xscale=$width/$toWidth;
  $yscale=$height/$toHeight;

  // Cuando la escala en y es mayor que la escala en x
  // implica que debemos redimensionar en base al nuevo
  // alto.
  if ($yscale>$xscale){
    $new_width = round($width * (1/$yscale));
    $new_height = round($height * (1/$yscale));
    
  // Por el contrario si la escala en x es mayor o igual
  // debemos de redimensionar en base al nuevo ancho.
  } else {
    $new_width = round($width * (1/$xscale));
    $new_height = round($height * (1/$xscale));
  }
  
  // Reservamos espacio en memoria para la nueva imágen
  $imageResized = imagecreatetruecolor($new_width, $new_height);
  
  // Cargamos la imágen original y redimensionamos
  $imageTmp     = imagecreatefromjpeg ($originalImage);
  imagecopyresampled($imageResized, $imageTmp,
    0, 0, 0, 0, $new_width, $new_height, $width, $height);

  // Devolvemos la nueva imágen redimensionada.
  return $imageResized;
}

Un ejemplo sencillo de uso:

$imagenRedimensionada = resizeImage("miImagen.jpg",800,800);
imagejpeg($imagenRedimensionada,"miImagen800.jpg",100);

Espero este código les haya sido útil. ¡Hasta la próxima!

No hay comentarios: