- Home
- Categorie
- Coding e Sistemistica
- PHP
- [Tutorial PHP+GD] Semplice Fotogallery con ridimensionamento immagini
-
ottimo tutorial!
volevo sapere se questo script può funzionare utilizzandolo in due spazi web diversi, le foto in uno, e le pagine in un altro.
-
Non può funzionare su due spazi diversi.
-
ottimo lavoro e grazie...
-
Ottimo questo script...sto realizzando un sito personale in cui metto tutti i miei dipinti, ho inserito questa photogallery modificando i parametri e funziona perfettamente!! Ti chiedo solo una cortesia: ho visto che questo script stampa a video le foto in base all'ordine alfabetico dei file relativi. e' possibile invertire l'ordine dei file dell'array? Ho provato a modificare il codice mettendoci funzioni come array_reverse() e rsort() ma non riesco proprio a farlo funzionare. Qualcuno è così gentile da dirmi come si fa? Perchè ho nominato i file .jpg dei miei dipinti con numeri progressivi e vorrei che l'ultimo dipinto inserito (il più recente) sia il primo visualizzato. Lo script è fantastico e ci terrei a fare questa modifica. Grazie per l'attenzione.
-
Se non ho capito male tu hai immagini nominate in questo modo:
1.jpg (più vecchia)
2.jpg
3.jpg
4.jpg (più recente)Se è così, allora basterà apportare poche modifiche, che ho segnato con il segno <<-----, al codice qui sotto:
[PHP]
<?php
#######################
# #
# Fotogallery. #
# Per configurarla #
# vai nel file: #
# config_gallery.php #
# #
#######################// Inclusione del file config_gallery.php per aquisire le variabili. include("config_gallery.php"); // Recupero della variabile passata in get. // il valore "index" rappresenta l'indice della fotogallery, "view" la visualizzazione della singola foto. @$mode = $_GET['mode']; // Definizione delle variabili in base al valore di $mode if ($mode == "index" || empty($mode) || !isset($mode)) { $quanto = $thumb_width; } elseif ($mode == "view") { $quanto = $photo_width; $destination_path = $dir; } // Aumenta la memoria utilizzabile fino a 128mb e il timeout a 4 minuti. // Questo ci consente di creare le miniature senza avere un errore di timeout dal server ini_set("memory_limit", "128M"); set_time_limit(240); // Se non esiste la cartella di destinazione delle miniature (vedi config_gallery.php) ne si forza la creazione if (!file_exists($destination_path)) { mkdir($destination_path , 0777); } // Apertura della directory in cui sono contenute le foto a dimensione originale if ($handle = opendir($dir)) { // Lettura delle immagini conenute nella cartella $dir while (false !== ($file = readdir($handle))) { list($width, $height, $type, $attr) = @getimagesize($dir.$file); // Se è una immagine "JPEG" continuo con la sua elaborazione // altrimenti si passa alla foto successiva if($type == 2) { // Elaborazione delle nuove dimensioni (altezza e larghezza) in proporzione. // Ciò consente di non alterare la qualità della immagine. if($width > $height) { $new_width = $quanto; $new_height = ($quanto * $height) / $width; $new_height = number_format($new_height, 0); } elseif($height > $width) { $new_height = $quanto; $new_width = ($quanto * $width) / $height; $new_width = number_format($new_width, 0); } elseif($height == $width) { $new_width = $quanto; $new_height = $quanto; } //Se si sta visualizzando una singola foto e questa è già stata ridimensionata si ignora questo passaggio, altrimenti la foto viene ridimensionata. // L'"if" controlla se la foto in questione ha già le dimensioni desiderate. Se le dimensioni non sono uguali a quelle volute, verrà ridimensionata. if ($mode == "view") { if ($new_height != $height && $new_width != $width) { isset($compression) ? $compression = $compression : $compression = 100; // In cso non sia settata la compressione (vedi config_gallery.php) gli si assegna il valore di default $destimg=imagecreatetruecolor($new_width,$new_height) or die("Problemi nelle creazioni dell'immagine");// Creazione Immagine $srcimg=ImageCreateFromJPEG($dir.$file) or die("Problemi nell'aprire l'immagine"); //Apertura Immagine Originale ImageCopyResampled($destimg,$srcimg,0,0,0,0,$new_width,$new_height,ImageSX($srcimg),ImageSY($srcimg)) or die("Problemi nel ridimensionamento"); //Ridimensionamento Nuova Immagine ImageJPEG($destimg, $destination_path.$file, $compression) or die("Problemi nel salvataggio"); //Salvataggio Nuova Immagine } } //Se si sta visualizzando l'indice delle foto (contenente le miniature) e queste sono già state ridimensionate si ignora questo passaggio, altrimenti la foto viene ridimensionata. // l'"if" controlla se esiste già una miniatura, chiamata con lo stesso nome della foto originale, presente nella cartella di destinazione. Se non esiste viene creata la minatura elseif (empty($mode)) { if (!file_exists($destination_path.'/'.$file)) //Se la miniatura non esiste verrà creata altrimenti si ignora questo passaggio { isset($compression) ? $compression = $compression : $compression = 100; // In cso non sia settata la compressione (vedi config_gallery.php) gli si assegna il valore di default $destimg=imagecreatetruecolor($new_width,$new_height) or die("Problemi nelle creazioni dell'immagine");// Creazione Immagine $srcimg=ImageCreateFromJPEG($dir.$file) or die("Problemi nell'aprire l'immagine"); //Apertura Immagine Originale ImageCopyResampled($destimg,$srcimg,0,0,0,0,$new_width,$new_height,ImageSX($srcimg),ImageSY($srcimg)) or die("Problemi nel ridimensionamento"); //Ridimensionamento Nuova Immagine ImageJPEG($destimg, $destination_path.$file, $compression) or die("Problemi nel salvataggio"); //Salvataggio Nuova Immagine } } $i = explode('.', $file, -1); // <<---- Questo permette di utilizzare il nome delle immagini come indice per l'array successivamente ordinato $image * = $file; //Creazione dell'array contenente le immagini } } // Chiusura della cartella $dir closedir($handle); } else { // Se vi è un errore nell'aprire la cartella $dir allora viene stampato a video seguente paragrafo echo "<p align=\"center\"> Impossibile eseguire lo script. <br /> Accertati di aver impostato correttamente i parametri e che la cartella (nome: \"<b>$dir</b>\" ) in cui sono contenute le foto esista </p>"; } //Se si sta visualizzando l'indice allora utilizzo la paginazione propria dell'indice if ($mode == "index" || empty($mode) || !isset($mode)) { ######################## # Paginazione per # # la visualizzazione # # dell'indice # ######################## // Se si è scelto di utilizzare la paginazione (vedi file config_gallery.php) allora vengono stampati i links. // Altrimenti verranno visualizzate tutte le immagini nella stessa pagina. if (empty($numperpagina)) { $numperpagina = count($image); } isset($_GET['page']) ? $pageNum = $_GET['page'] : $pageNum = 1; $inizio = ($pageNum - 1) * $numperpagina; $fine = $inizio + $numperpagina; krsort($image); // <<---------- ORDINIAMO L'ARRAY IN MODO DECRESCENTE $i = 1; //inizializzo l'indice foreach ($image as $id => $nome) { if ($i > $fine) { break; } if ($i >= $inizio) { // stampa la miniatura echo " <a href=\"?id=$i&from=$pageNum&mode=view\"><img src=\"".$destination_path.$nome."\" title=\"".$nome."\" border=\"0\" alt=\"foto\" /></a>"; } $i++; // incremento dell'indice } if ($fine > count($image)) { $fine = count($image); } // Conto delle pagine $maxPage = ceil(count($image)/$numperpagina); // Creazione link per accedere ad ogni pagina $self = $_SERVER['PHP_SELF']; $nav = ''; for($page = 1; $page <= $maxPage; $page++) { if ($page == $pageNum) { $nav .= " $page "; } else { $nav .= " <a href=\"?page=$page\" title=\"Pagina $page di $maxPage\">$page</a> "; } } // Creazione links Previous e Next // e quelli First page e Last page if ($pageNum > 1) { $page = $pageNum - 1; $prev = " <a href=\"?page=$page\" title=\"Pagina $page di $maxPage\"><< precedente</a> "; } else { $prev = ''; // se siamo nella 1° pag non mostriamo Prev } if ($pageNum < $maxPage) { $page = $pageNum + 1; $next = " <a href=\"?page=$page\" title=\"Pagina $page di $maxPage\" >successivo >></a> "; } else { $next = ''; // siamo nell' ultima pag, nn mostriamo Next } // mostra i links di navigazione echo "<br />Pagine: ", $prev . $nav . $next ; print_r($image); } //Se si sta visualizzando a singola foto allora utilizzo la paginazione per visualizzare i link "precedente", "torna indietro" e "successiva" elseif ($mode == "view") { ######################## # Paginazione per # # la visualizzazione # # della singola foto # ######################## //Aquiusizione dell'id della foto. Default: 1 isset($_GET['id']) ? $id = $_GET['id'] : $id = 1 ; //Stampa a video della foto echo "<img src=\"".$dir.$image[$id]."\" title=\"".$image[$id]."\" alt=\"".$image[$id]."\" />"; echo "<br />".$image[$id]; //Categoria da cui si proviene if (isset($_GET['from'])) { $from = $_GET['from']; } else $from = 1; //Link Foto Precedente if ($id == 1) { $precedente = ""; //Se siamo nella prima pagina non mostriamo il link alla foto precedente } else { $prev = $id - 1; $precedente = "<a href=\"?id=$prev&from=$from&mode=view \"><< Foto precedente</a>"; } // Link Foto Successiva if ($id == count($image)) { $successiva = ""; //Se siamo nella ultima pagina non mostriamo il link alla foto successiva } else { $next = $id + 1; $successiva = "<a href=\"?id=$next&from=$from&mode=view \">Foto successiva >></a>"; } //Stampa paginazione echo "<br /><br />".$precedente." <a href=\"?page=$from\">Indice foto</a> ".$successiva; }
?>
[/PHP]Ho solo eliminato la creazione dell'indice nel primo ciclo sostituendola con il nome del file e poi lo ordinato in modo descrescente prima di stampare le immagini a video:
[PHP] $i = explode('.', $file, -1); //Creo l'indice
krsort($image); //Ordino
[/PHP]Attenzione che ho utilizzato il limite negativo per la funzione explode che è valida solo dal PHP5 in su... in caso ci siano problemi la cambio subito
-
Grazie mille per la disponibilità!!! Ora provo subito ad apportare le modifiche. Scusa ma non sono un genio in php... comunque la mia idea è come hai detto tu... le immagini sono 1.jpg....4.jpg e voglio visualizzarle dalla 4 alla 1. Appena finito ti faccio sapere e ti mando in privato il link al mio sito in cui puoi vedere la photogallery creata col tuo codice. Grazie ancora.
-
Ehm..ho modificato il codice come hai detto, ma a video mi stampa l'errore:
Warning: Illegal offset type in C:\Programmi\EasyPHP5.3.0\www\main_gallery.php on line 101tante volte quante sono le immagini della cartella.
La linea 101 nel mio file php corrisponde a:
$image * = $file; //Creazione dell'array contenente le immaginisubito dopo l' explode()
Premetto che sul server locale ho php 5.3.0. Intanto sto cercando di capire cosa c'è che non va...
Ciao!!!
-
Prova così... ho sbagliato nello scrivere la variabile $i, che in realtà è un array:
[PHP]
$i = explode('.', $file, -1); //Creo l'indice
$k = $i[0];
$image [$k] = $file; //Creazione dell'array contenente le immagini
[/PHP]Vediamo se così funziona
P.S.: volevo segnalarti che questo stesso script l'ho migliorato rifacendolo completamente tempo fa. Lo puoi trovare qui http://www.giorgiotave.it/forum/scripting-e-risorse-utili/106519-script-fotogallery-con-resize-lightbox-categorie.html
-
Grazie inverter..ho fatto le correzioni che hai riportato...ora le thumbnails sono ordinate al contrario come volevo 8.jpg, 7.jpg, 6.jpg eccetera fino alla 1.jpg. Il problema ora è che cliccando le thumbs si aprono le immagini ingrandite ma non c'è corrispondenza tra thumb e relativa immagine grande... scusami se ti ho creato grattacapi ma è che il tuo script è il migliore tra quelli che ho provato in rete.
-
In pratica cliccando sulla prima thumb si apre l'ultima immagine grande, la seconda thumb la penultima immagine grande.
-
Grazie Inverter ho risolto il problemino: dopo modifiche fatte un po' a tentoni ho semplicemente sostituito in:
echo " <a href="?id=$i&from=$pageNum&mode=view"><img src="".$destination_path.$nome."" title="click for a full view" alt="foto" /></a>
con $id
Ora funziona tutto!! Grazie per la cortesia!!
-
Ho messo in linea nel mio sito, di cui ti ho inviato il link, la photogallery con le immagini ordinate dalla più recente alla più vecchia. Ho provato a modificare il codice per far sì che le immagini siano contenute dentro le celle una tabella...senza riuscirci ovviamente. Ho provato a mettere un ciclo for che contiene il foreach... e l'esecuzione dello script mi ha bloccato tutto il pc....Secondo voi l'aggiunta della tabella appesantisce un pò troppo l'esecuzione dello script? Buona serata a tutti.
-
Ciao non riesco a scaricare lo script me lo potresti mandare per email? [email][email protected][/email]
-
Ciao questo script mi sembra interessante potresti inviarmelo via email.
La mia mail e' :
esmi_ale
@hotmail
.it
-
Ciao mi potresti mandare lo script per la fotogallery
-
Complimenti per questo script. Per un paio di giorni infatti ho cercato uno script che mi permettesse di capire qualcosa oltre che copiare e incollare il codice.
Sono nuovissima del php e infatti non riesco a risolvere una questioncina: sotto le miniature c'è la scritta di ordinamento delle foto e vorrei toglierla e anche sotto ogni foto c'è il titolo della foto.
Ho provato a rimuovere "$title" ma non funziona.
È che non sono assolutamente pratica.
Ringrazio ancora per lo script!
-
Vediamo se ricordo ancora qualcosa di questo script
@birilubina said:
sotto le miniature c'è la scritta di ordinamento delle foto e vorrei toglierla
Ti consiglio di commentare la riga di codice che visualizza i link della paginazione in questo modo:
cerchi la riga
[PHP] // mostra i links di navigazione
echo "<br />Pagine: ", $prev . $nav . $next [/PHP]e la fai diventare
[PHP] // mostra i links di navigazione
//echo "<br />Pagine: ", $prev . $nav . $next [/PHP]Non dovresti avere problemi e se un giorno ti interesserà avere questa funzione potrai eliminare il commento.
@birilubina said:
sotto ogni foto c'è il titolo della foto.
Ho provato a rimuovere "$title" ma non funziona.Devi eliminare la riga
[PHP]echo "<br />".$image[$id];[/PHP]
che si trova sotto il commmento "//stampa a video della foto"Ciao!
P.S.: Rileggendo il codice mi sembra di aver dimenticato un "print_r()" assolutamente inutile
Se vuoi quindi elimina la riga
[PHP] print_r($image);
[/PHP]
-
bene! grazie ancora!
adesso vorrei cambiare il carattere delle scritte "indice" eccetera ma spero di riuscirlo a fare da sola. Più che altro..sapresti consigliarmi un editor visuale di php per linux (mint)?
Io per adesso sto usando kompozer ma è per html, poi uso un traduttore online per trasformarlo in php e così facendo non riesco a capire bene nè l'html nè il php.
-
sono di nuovo io
sono riuscita a cambiare i caratteri, non riesco a trovare un editor visuale di php come kompozer quindi vado avanti così per adesso.
Ti chiederei per cortesia come fare a eliminare la schermata delle miniature, preferirei infatti non visualizzarla...cosa devo togliere di preciso?
grazie ancora e scusa per lo stress
-
Ciao.
Scusa se non ho risposto ma ero fuori cittàNon ho capito bene quale parte dello script vuoi eliminare, in che senso la schermata delle miniature?
Per quanto riguarda l'editor, credo che un editor "visuale" per php non esista, al massimo esiste per l'html con il quale costruisci la struttura (layout) del sito. Il php è codice puro che va scritto in tutto e per tutto a mano. Se può esserti d'aiuto io uso RapidPHP che è a pagamento, ma se fai un giro su google ne trovi di molto validi anche gratuiti