28 feb 2011

[PHP] Galería de imágenes en una carpeta

Esta vez os traigo el código para mostrar las imágenes que tengáis en una carpeta de vuestro servidor.
Se divide en 2 scripts:
Uno mostrara la lista de imágenes de forma paginada, es decir, si tenéis mas de X imágenes, se muestran esas X y abajo saldrán los enlaces al resto de paginas.
El otro se encarga de generar las miniaturas (thumbnails en ingles) si la imagen es mas grande que el ancho máximo.
El código esta explicado para que lo podáis adaptar a vuestras necesidades.
Si tenéis alguna duda de como configurarlo/adaptarlo, habéis visto un error o tenéis alguna sugerencia, es bien recibida, que para eso esta la licencia GPL 3 ;)

galeria.php:

<table>
 <tr>
<?php
header('Content-type: text/html; charset=utf-8');
# Galería de imágenes
# (CC) Alfonso Saavedra "Son Link"
# Bajo GPLv3

$path = 'fotos'; # Directorio donde están las imágenes
$limit = 4; # Cuantas imágenes se mostraran por pagina
$limit_file = 5; # Imágenes a mostrar por linea en la tabla
$n = 0;
$desde;
$hasta;
# Comprobamos si es un directorio y si lo es nos movemos a el
if (is_dir($path)){
 $dir = opendir($path);
 # Recorremos los ficheros que hay en el directorio y cogemos solamente aquellos cuya extensión
 # sea jpg, gif y png y la guardamos en una lista
 while (false !== ($file = readdir($dir))) {
  if (preg_match("#([a-zA-Z0-9_\-\s]+)\.(gif|GIF|jpg|JPG|png|PNG)#is",$file)){
   $list[] = $file;
  }
 }
 # Cerramos el directorio
 closedir($dir);
 # Ordenamos la lista
 sort ($list);
 # Contamos el total de elementos en la lista
 $total = count($list);
 $paginas = ceil($total/$limit);
 if (!isset($_GET['pg'])){
  $desde = 0;
  $hasta = $desde + $limit;
 }else if((int)$_GET['pg'] > ($paginas-1)){
  # Si pg es mayor que el total de paginas se muestra un error
  echo "<b>No existe esta pagina en la galería</b><br /><a href='galeria.php'>Volver a la galería</a>";
  die();
 }else{
  $desde = (int)$_GET['pg'];
 }
 # Y generamos los enlaces con los thumbnails
 for ($i=($desde*$limit);($i!=$total) && ($i<($desde*$limit)+$limit);$i++){
  # Comprobamos si existe en la lista una llave con el valor actual de $i para evitar errores
  if(array_key_exists($i, $list)){
   echo "<td><a href='$path/$list[$i]'><img src='thumb.php?img=$path/$list[$i]' /></a><br></td>\n";
   $n++;
   if ($n == $limit_file){
    echo "</tr>\n<tr>\n";
    $n = 0;
   }
  }
 }
}else{
 echo "$path no es un directorio";
}
?>
 </tr>
</table>
<p id="paginas">
<?php
# Generamos un listado de las paginas de la galería
for ($p = 0; $p<$paginas; $p++){
 $pg = $p+1;
 if ($p == $desde){
  echo "$pg ";
 }else{
  echo "<a href ='?pg=$p'>$pg</a> ";
 } 
}?>
</p>
<?php echo "Hay un total de $total imagen(es) en $paginas paginas(s)" ?>

thumb.php
<?php
# Generador de Thumbnails para galerías de imágenes
# (CC) Alfonso Saavedra "Son Link"
# Bajo GPLv3

# Indicamos al navegador que lo que se envía es una imagen en formato jpg
header( "Content-type: image/jpeg" );
if (!empty($_GET['img'])){
 $new_width  = 150; // Tamaño a definir
 
 $img = $_GET['img'];
 # obtenemos las extensiones de los archivos para llamar a la función correspondiente
 $ext = preg_split('/\./', $img);
 if ($ext[1] == 'JPG' || $ext[1] == 'jpg'){
  $image = ImageCreateFromJPEG($img);
 }else if ($ext[1] == 'gif' || $ext[1] == 'GIF'){
  $image = ImageCreateFromGIF($img);
 }else if ($ext[1] == 'png' || $ext[1] == 'PNG'){
  $image = ImageCreateFromPNG($img);
 }
 # Obtenemos el ancho y el alto de la imagen
 $width  = imagesx($image) ;
 $height = imagesy($image) ;
 # Si el ancho de la imagen es igual o menor del indicado en new_width redirigimos directamente a la imagen
 if ($width < $new_width){
  imagedestroy($image);
  header("location: $img");
 }else{
  # En caso contrario se crea el thumbnail
  $new_height = ($new_width * $height) / $width ; // tamaño proporcional

  $thumb = imagecreatetruecolor($new_width,$new_height);

  imagecopyresized($thumb,$image,0,0,0,0,$new_width,$new_height,$width,$height);
  #mostramos la imagen generada
  ImageJPEG($thumb);
  # Y liberamos memoria
  imagedestroy($image);
  imagedestroy($thumb);
 }
}
?>


Variables a modificar:
$path: aquí ponemos la ruta a la carpeta donde están las imágenes
$limit: El total de imágenes a mostrar en cada pagina
$limit_file: numero de imágenes a mostrar en cada fila de la tabla

Pages 251234 »
Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by Blogger