[PHP] Galleria immagini

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Buonasera a tutti, ho trovato in rete questa galleria immagini da mostrare sul proprio sito ma avrei bisogno di voi.. non riesco proprio a venirne a capo.. vorrei implementare quattro funzioni:

- Tasto download di fianco alla foto.
- L'anteprima delle foto non in dimensioni reali ma piccole, circa 128x128 ( quello presente non funziona).
- Apertura foto al passaggio del mouse o cliccandoci sopra senza cambiare indirizzo pagina.
- Aggiungere altri formati di foto.

Grazie a tutti!

PAGINA galleria.php

PHP:
<?php
// Configurazione della galleria
// ---------------------------------

// percorso della cartella contenente le immagini ORIGINALI
$path_immagini = "upload/immagini/";
// percorso della cartella che dovrà contenere le anteprime
$path_anteprime = "upload/immagini/";

// numero di righe e colonne della tabella che mostrerà le anteprime
$num_righe = 3;
$num_colonne = 3;

// larghezza ed altezza massima delle anteprime
$larghezza_ant = 150;
$altezza_ant = 150;
// ---------------------------------


// provo ad "aprire" la cartella delle immagini originali
$handle = @opendir($path_immagini);

// se c'è stato un errore...
if(!$handle)
die ("Errore nell'apertura della cartella delle immagini '$path_immagini'");

// inizializzo l'array che conterrà i nomi delle immagini
$immagini = array();

// memorizzo in $immagini tutti i nomi delle immagini (JPG) presenti nella cartella degli originali
while (false !== ($file = readdir($handle)))
{
   if ($file != '.' && $file != '..' && strpos($file,'.png'))
   {
      if(strpos($file,'.png'))
      $immagini[] = $file;
   }
}

// metto in ordine alfabetico le immagini
sort($immagini);

// calcolo il numero dell'ultima pagina
$ultima_pagina = ceil(count($immagini) / ($num_righe * $num_colonne));

// decido che pagina mostrare
if(isset($_GET['pag']))
{
   // se è nell'URL è presente un numero di pagina
   if(is_numeric($_GET['pag']) && $_GET['pag'] > 0 && $_GET['pag'] <= $ultima_pagina)
   {
      // se il numero di pagina indicato è lecito
      $pag_corrente = $_GET['pag'];
   }
   else
   {
      // nell'URL è stato messo un numero di pagina errato.
      // l'utente sta "giocando" con il nostro script !!!
      header('location: galleria.php?pag=1');
      exit;
   }
}
else
{
   // se non è stato specificato nulla via URL mostro la prima pagina
   $pag_corrente = 1;
}

// quale sarà la prima immagine da mostrare nella pagina corrente?
$immagine_iniziale = ($pag_corrente-1) * $num_righe * $num_colonne;

// Costruisco dei link per accedere alla pagina precedente e successiva (se esistono!)
$navigatore = '';
if($pag_corrente > 1)
$navigatore .= '<a href="galleria.php?pag='.($pag_corrente-1).'">&lt;&lt; Precedente</a> ';

if($pag_corrente < $ultima_pagina)
$navigatore .= '<a href="galleria.php?pag='.($pag_corrente+1).'">Successiva &gt;&gt;</a>';

// adesso devo costruire la tabella che conterrà le anteprime
$tab_immagini = '';
// il primo cliclo FOR è per costruire le righe
for ($i = 0; $i < $num_righe ; $i++)
{
   // se all'inizio di una riga mi accorgo che non ci sono più immagini da visualizzare
   // allora interrompo le iterazioni
   if(!isset($immagini[($i*$num_colonne) + $immagine_iniziale]))
      break;

   // apro la riga corrente
   $tab_immagini .= '<tr>';

   // il secondo ciclo FOR serve invece a costruire le singole celle apparteneti ad una riga
   for ($j = 0; $j < $num_colonne; $j++)
   {
      // l'indice dell'immagine da mostrare nella cella corrente
      $indice = ($i*$num_colonne) + $j + $immagine_iniziale;

      // se esiste una immagine con questo indice (potrebbero essere finite!)
      if(isset($immagini[$indice]))
      {
         // controllo che esista l'anteprima per l'immagine corrente
         // in caso contrario la creo "al volo"
         if(!file_exists($path_anteprime.$immagini[$indice]))
            crea_anteprima($immagini[$indice],$larghezza_ant,$altezza_ant,$path_immagini,$path_anteprime);

         // ricavo le dimensioni dell'anteprima corrente
         list($width, $height) = getimagesize($path_anteprime.$immagini[$indice]);

         // non mi resta che creare i tag per il link, l'immagine ed i nome dell'immagine
         $cella = '<a href="'.$path_immagini.$immagini[$indice].'">';
         $cella .= '<img src="'.$path_anteprime.$immagini[$indice].'" alt="'.$immagini[$indice].'" height="'.$height.'" width="'.$width.'">';
         $cella .='<br><p align="center">' .  $immagini[$indice] . '</p>';
         $cella .='</a>';
      }
      else
      {
         // sono finite le immagini! Lascio la cella vuota
         $cella = '&nbsp;';
      }

      // metto il contenuto della cella appena creata nella tabella
      $tab_immagini .=  '<td class="cella_immagine"  align="center" valign="middle">'. $cella . '</td>';
   }

   // chiudo la riga corrente
   $tab_immagini .= '</tr>';
}

// tutto il contenuto "dinamico" è stato preparato, devo solo caricare il template che si occuperà di mostrarlo
// per proteggermi dal caricamento del template esternamente allo script definisco una costante...
define('LOAD_TEMPLATE',1);
include('template.php');

// fine dello script
exit;


// funzione per la creazione delle anteprime
function crea_anteprima($nome_immagine,$larghezza_anteprima,$altezza_anteprima,$path_immagini,$path_anteprime)
{
   // ricavo la dimensione dell'immagine originale
   list($larghezza_orig, $altezza_orig) = getimagesize($path_immagini.$nome_immagine);

   if ($larghezza_orig < $altezza_orig) {
      $larghezza_anteprima = ($altezza_anteprima / $altezza_orig) * $larghezza_orig;
   } else {
      $altezza_anteprima = ($larghezza_anteprima / $larghezza_orig) * $altezza_orig;
   }

   // creo una nuova immagine, che conterrà l'anteprima
   $image_p = imagecreatetruecolor($larghezza_anteprima, $altezza_anteprima);

   // carico l'originale
   $image = imagecreatefromjpeg($path_immagini.$nome_immagine);

   // metto nella nuova immagine la "riduzione" dell'originale
   imagecopyresampled($image_p, $image, 0, 0, 0, 0, $larghezza_anteprima, $altezza_anteprima, $larghezza_orig, $altezza_orig);

   // salvo l'anteprima
   imagejpeg($image_p, $path_anteprime.$nome_immagine);
}
?>
PAGINA template.php

PHP:
<?php
if(!defined('LOAD_TEMPLATE'))
   exit('Accesso diretto non consentito!');
?>
HTML:
<head>
<title>Galleria immagini</title>
</head>

<body>
<table border="0" align="center" cellpadding="5" cellspacing="0" id="main_tab">
  <tr>
    <td>
   <table width="100%"  border="0" cellspacing="5" cellpadding="5" id="header_tab">
      <tr>
        <td><div align="left">Pagina <?php echo $pag_corrente?>/<?php echo $ultima_pagina?> </div></td>
        <td><div align="right"><?php echo $navigatore?></div></td>
      </tr>
    </table>
      <table width="100%"  border="0" cellspacing="5" cellpadding="5">
        <?php echo $tab_immagini?>
      </table></td>
  </tr>
</table>
</body>
</html>
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.266
82
48
IT/SW
File index.php che legge le img...
PHP:
$images=explode(',', '1547894295.png,1547894297.png,1547894299.png,1547894306.png,1547894309.png,1547894313.png,1547894316.png,1547894325.png,1547894295.png,1547894297.png,1547894299.png,1547894306.png,1547894309.png,1547894313.png,1547894316.png,1547894325.png,1547894295.png,1547894297.png,1547894299.png,1547894306.png,1547894309.png,1547894313.png,1547894316.png,1547894325.png,1547894295.png,1547894297.png,1547894299.png,1547894306.png,1547894309.png,1547894313.png,1547894316.png,1547894325.png,1547894295.png,1547894297.png,1547894299.png,1547894306.png,1547894309.png,1547894313.png,1547894316.png,1547894325.png,1547894295.png,1547894297.png,1547894299.png,1547894306.png,1547894309.png,1547894313.png,1547894316.png,1547894325.png');
$items_col=3;
$items_row=3;
$img=array_chunk($images,($items_col*$items_row));
$current_view=$img[0];
if(isset($_GET['page'])){
   $accept=range(1,count($img));
   (!in_array($_GET['page'],$accept))?exit:$current_view=$img[intval($_GET['page'])-1];
}
$table='<table>';
$current_increment=0;
for($i=0;$i<$items_row;$i++){
   $table.='<tr>';
   for($j=0;$j<$items_col;$j++){
      if(isset($current_view[$current_increment])){
         $table.='<td>
                  <a href="images/'.$current_view[$current_increment].'">
                     <img src="show_image.php?img='.$current_view[$current_increment].'" />
                  </a>
               </td>';
         $current_increment++;
      }
   }
   $table.='</tr>';
}
$table.='</table>';
echo $table;
File show_image.php
PHP:
include_once ('classes/Image.php');
use Madi\Image as CImage;

if(isset($_GET['img'])){
   get_image($_GET['img']);
}


function get_image($img){
   $options=
      [
         'w'=>200,
         'h'=>200,
         'square'=>TRUE,
         'image'=>__DIR__.'/books-icon.png',
         'quality'=>100
      ];
   $options['image']=__DIR__.'/images/'.$img;
   $img=new CImage\Image($options);
   $img->load_image()
         ->check_dimensions()
         ->show();
}
Classe Image
PHP:
<?php
/**
* Created by PhpS.
* User: macus
* Date: 19/01/2019
* Time: 10:58
*/

namespace Madi\Image;


class Image {


   public $image;

   public $remote=FALSE;

   public $watermark=FALSE;

   protected $error=FALSE;

   protected $error_message='';

   public $img_obj;

   public $w,$h,$square,$quality;



   public function __construct($opt=[]) {

      $this->set_property($opt);


   }
   public function set_property($options,$value=''){
      if(is_array($options)){
         foreach ($options as $k=>$v){
            $this->set_property($k,$v);
         }
      }else{
         if(property_exists($this,$options))$this->$options=$value;
      }
   }


   public function load_image($image=''){
      if(!empty($image)){
         $this->image=$image;
         $this->img_obj=new \Imagick($image);

      }else{
         if(!empty($this->image))return $this->load_image($this->image);
         $this->error=TRUE;
         $this->error_message='IMAGE NOT DEFINED';
         $this->error_();
      }
      return $this;
   }

   protected function square_image($dim){
      $img=new \Imagick();
      $img->newImage($dim,$dim,new \ImagickPixel('transparent'),'png');
      $img->setImageFormat ('png');
      $img->setImageBackgroundColor("transparent");
      $img->setImageVirtualPixelMethod(  \Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);

      return $img;
   }


   public function check_dimensions(){
      if($this->square && $this->w==$this->h){

         $this->img_obj->cropThumbnailImage($this->w,$this->h);

      }else{
         $this->img_obj->cropThumbnailImage($this->w,$this->h);
         $this->img_obj->resizeImage($this->w,$this->h,\Imagick::FILTER_QUADRATIC,1,FALSE);
      }
      return $this;
   }

   public function show($image=''){
      (!empty($image))?$this->load_image($image):null;

      (empty($this->quality))?$this->quality=100:null;

      $this->img_obj->setCompressionQuality($this->quality);

      header('Content-Type: image/'.$this->img_obj->getImageFormat());
      echo $this->img_obj;
   }



   public function error_(){
      echo $this->error_message;
   }


}
 

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Grazie della risposta, come meccanismo è quello che cerco, solo che in questo modo dovrei inserire io i nomi delle foto e ma non mi appare l'anteprima, esce un'immagine corrotta, mentre se ci clicco sopra la apre, quindi il codice è giusto.. mi sai dire come mai?
 

macus_adi

Utente Attivo
5 Dic 2017
1.266
82
48
IT/SW
solo che in questo modo dovrei inserire io i nomi delle foto e ma non mi appare l'anteprima
I nomi non li devi scrivere..... al posto della lista metti il tuo
PHP:
scandir(__DIR__)
....

<a href="images/'.$current_view[$current_increment].'"> <!-- link a immagine originale -->
<img src="show_image.php?img='
.$current_view[$current_increment].'" /> <!-- questa è l'anteprima -->
</a>
Leggi bene!
 

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Probabilmente sbaglio io qualcosa.. ho sostituito cosa mi hai detto con:

PHP:
$images=scandir(__DIR__);
e

PHP:
                  <a href="upload/immagini/'.$current_view[$current_increment].'">
                     <img src="show_image.php?img='.$current_view[$current_increment].'" />
                  </a>
 

macus_adi

Utente Attivo
5 Dic 2017
1.266
82
48
IT/SW
.... mhà.... normale che devi customizzare lo script come ti interessa....
PHP:
$files=scandir('metti il percorso della tua directory');