En mi otro blog necesitaba un código que me generara miniaturas o thumbnails de forma que el resultado sea una imagen cuadrada sin desformar.

Buscando por la red encontré este código que funciona a la perfección pero no se adapta a lo que yo necesito:

  1. Necesito que funciones con images JPG, PNG y GIF.
  2. Necesito que sea una función a la que le pasaré la ruta completa de la imagen.
  3. Necesito que la imagen sea almacenada en un directorio aparte y además que el script compruebe si ya ha sigo generada para no volver a generarla nuevamente si es así.

Para empezar comenzaré explicando un poco el funcionamiento del código de partida.

Código de partida.

Para empezar el código lo que hace es leer el ancho y alto de la imagen y luego a partir de esos datos define el nuevo alto y ancho además de la nueva posición del recorte. Esto es difícil de explicar con palabras pero básicamente el código lo que hace es lo siguiente:

Luego, las últimas 6 lineas generan la nueva imagen utilizando la librería GD.

¿Que he añadido en el código?

Para empezar las 3 primeras lineas son dos variables simples que definirán el nuevo tamaño y el directorio en donde se guardará la nueva imagen generada.

A continuación, las siguientes 9 lineas obtienen a partir de la variable de entrada $img el directorio y localización de la imagen a partir de la que generaremos la miniatura, el nombre de la imagen y la extensión de la imagen.

Después viene el código de partida del que hemos hablado arriba y justo después pasamos a generar la imagen. La librería GD utiliza diferentes funciones dependiendo del formato de la imagen por lo que debemos averiguar el formato de la imagen y dependiendo del que sea usar unas lineas o otras, por ello usamos el if, elseif y else.

Por último, la función muestra la imagen.

Espero haberme explicado bien. A continuación os dejo el código completo. Espero que os sea de utilidad. Yo lo he probado en mi sitio y para lo que yo quiero funciona a la perfección.

Código PHP (Copiar):
  1. <?php
  2. function thumbnail($img)
  3. {   
  4.     /* Opciones */
  5.     $tamano = 150;     // Tamano en pixel de la miniatura
  6.     $destino = "thumbs/thumb_"; // Lugar de destino y etiqueta inicial
  7.    
  8.     // Obtenemos...
  9.     // ...el directorio de la img
  10.     $imgv = explode('/', $img)
  11.     $sup = $imgv[0]."//".$imgv[2]
  12.     $archivo = $img;
  13.     // ...el nombre de la imagen
  14.     $resultado = array_pop($imgv);
  15.     // ...la extencion de la imagen
  16.     $ext = explode('.', $img)
  17.        
  18.     /* ¿Ha sido generada ya? */
  19.     if (!file_exists($destino.$resultado))
  20.     {
  21.         // Obtenemos el tamaño actual y
  22.         // calculamos fijamos el nuevo tamano y posicion
  23.         list ($ancho, $alto) = getimagesize($archivo);
  24.         if ($ancho>$alto) {
  25.             $new_alto = $tamano;
  26.             $new_ancho = ($ancho/$alto)*$new_alto;
  27.             $x = ($ancho-$alto)/2;
  28.             $y = 0;
  29.             }
  30.         else {
  31.             $new_ancho = $tamano;
  32.             $new_alto = ($alto/$ancho)*$new_ancho;
  33.             $y = ($alto-$ancho)/2;
  34.             $x = 0;
  35.             }
  36.        
  37.         /* Vamos a generar la miniatura */
  38.         if (end($ext) == "png") {
  39.             $origen = imagecreatefrompng($archivo);
  40.             $temp = imagecreatetruecolor($tamano, $tamano);
  41.             imagecopyresampled($temp, $origen, 0, 0, $x, $y, $new_ancho, $new_alto, $ancho, $alto);
  42.             imagepng($temp, $destino.$resultado, 1);
  43.             imagedestroy($temp);
  44.             imagedestroy($origen);
  45.             }
  46.         elseif (end($ext) == "jpg" OR end($ext) == "jpeg") {
  47.             $origen = imagecreatefromjpeg($archivo);
  48.             $temp = imagecreatetruecolor($tamano, $tamano);
  49.             imagecopyresampled($temp, $origen, 0, 0, $x, $y, $new_ancho, $new_alto, $ancho, $alto);
  50.             imagejpeg($temp, $destino.$resultado, 90);
  51.             imagedestroy($temp);
  52.             imagedestroy($origen);
  53.             }
  54.         else {
  55.             $origen = imagecreatefromgif($archivo);
  56.             $temp = imagecreatetruecolor($tamano, $tamano);
  57.             imagecopyresampled($temp, $origen, 0, 0, $x, $y, $new_ancho, $new_alto, $ancho, $alto);
  58.             imagegif($temp, $destino.$resultado);
  59.             imagedestroy($temp);
  60.             imagedestroy($origen);
  61.             }
  62.     }
  63.    
  64.     /* Mostramos la miniatura en pantalla */
  65.     echo "<img src=".$destino.$resultado." />";
  66. }
  67. ?>
  68.  
  69. <?
  70.     thumbnail("URL_COMPLETA_HACIA_LA_IMAGEN");
  71. ?>