In questo tutorial vedremo in pratica come creare le miniature delle immagini presenti sul server usando semplice codice PHP e la libreria GD.
Avviso fin da subito che il codice qui descritto è valido solo con la GD library versione 2.0 o superiore. La versione 2.0 è supportata a partire da PHP 4.3.0 e seguenti.
Le librerie GD si rivelano utilissime nel caso ad esempio di web galleries. E’ infatti possibile caricare sul server le immagini in dimensione originale e lasciare ad uno script PHP il compito di creare le miniature delle immagini da visualizzare ad esempio in un indice delle immagini presenti. Ciò significa risparmiare molto tempo, in quanto le immagini non vanno ridotte a mano, e molto spazio, in quanto non è necessario conservare su un server sia le immagini a dimensione originale che le miniature di esse.
Durante il ridimensionamento delle immagini è inoltre possibile ridefinire il livello di compressione, regolando quindi il rapporto qualità/dimensione, rendendo così più veloce il caricamento della miniatura.
In parole povere ciò che lo script deve fare è aprire e leggere un’immagine gif o jpeg o png, ridimensionarla, ricomprimerla e salvarla su disco, oppure visualizzarla senza salvarla.
Analizzeremo il caso in cui l’immagini viene salvata su disco, e il codice è semplice:
<?php
$img = "immagini/immagine.jpeg"; // percorso al file dell'immagine
$dest = "miniature/"; // directory di salvataggio delle miniature create
// dimensioni della miniatura da creare
$thumbWidth = 60; // larghezza
$thumbHeight = 60; // altezza
// livello di compressione della miniatura
$thumbComp = 90;
// creazione dell'immagine della miniatura
$thumb = imagecreate($thumbWidth, $thumbHeight) or die("Impossibile creare la miniatura");
// apertura dell'immagine originale
$src = imagecreatefromjpeg($img) or die ("Impossibile aprire l'immagine originale");
// copio l'immagine originale in quella della miniatura ridimensionandola
imagecopyresized($thumb, $src, 0, 0, 0, 0, $thumbWidth, $thumbHeight, imageSx($src), imageSy($src)) or die("Impossibile ridimensionare l'immagine");
// salvataggio miniatura
imagejpeg($thumb, $dest, $thumbComp) or die("Impossibile salvare la miniatura");
?>
Analizziamo ora lo script: le prime righe sono chiare: inizialmente vengono memorizzati il percorso all’immagine originale sul server e la cartella di destinazione. $thumbWidth e $humbHeight sono invece le dimensioni che la miniatura dovrà assumere e $thumbComp è il livello di compressione della miniatura rispetto all’originale; la compressione è un valore compreso tra 0 e 100. 100 significa non compressa, 0 è il massimo della compressione. Più l’immagine viene compressa più sarà "leggera" e veloce da caricare, ma anche di qualità minore. Bisognerà quindi sempre trovare un compromesso tra dimensione e qualità.
Con imagecreate() creiamo semplicemente la base per la miniatura, impostandogli le dimensioni a $thumbWidth e $thumbHeight. Con imagecreatefromjpeg() invece creiamo un immagine uguale al file originale. A tale funzione come si può notare bisogna passare il percorso al file di immagine.
A questo punto bisogna copiare nella nuova immagine, cioè la miniatura, il contenuto dell’immagine originale, cambiando però le dimensioni. Si usa quindi imagecopyresized(), che fa quello che ci serve. Il formato di tale funzione è imagecopyresized (resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h). "dst_image" è l’immagine di destinazione, "src_image" è l’immagine originale, "dst_x/y" e "src_x/y" sono le coordinate di posizionamento dell’immagine originale su quella nuova, "dst_w/h" e "src_w/h" sono invece le dimensioni rispettivamente dell’immagine di destinazione e di quella originale. La funzione ritorna true o false, a seconda se la copia sia riuscita o meno.
Copiata l’immagine la salviamo con imagejpeg(). Il salvataggio avviene con il livello di compressione specificato. E’ possibile evitare il salavataggio e restituire solamente l’immagine omettendo il percorso del file da salvare.