Tagliare un'immagine con PHP e le GD2
Le librerie GD2 di PHP ci consentono di operare procedure anche avanzate per l'editing di file grafici senza la necessità di dover ricorrere a programmi di fotoritocco per la manipolazione delle immagini, inoltre esse mettono a disposizione strumenti per produrre dinamicamente queste procedure che saranno eseguite sulla base degli input definiti dagli utenti.
Uno degli esempi di utilizzo delle librerie GD2 è quello relativo ai tagli verticali o orizzontali sulle immagini, in particolare questo articolo presenterà la procedura necessaria per la creazione di porzioni d'immagine generate dal taglio verticale di un file sorgente.
Le parti prodotte dall'operazione di taglio saranno identiche per quanto riguarda le dimensioni.
Per rendere meglio l'idea dell'obiettivo che vogliamo raggiungere presentiamo nell'immagine sottostante un possibile esempio di JPEG sorgente:


Presenteremo ora il codice della nostra piccola applicazione, lasciando a dopo gli eventuali approfondimenti; il listato verrà presentato sotto forma di funzione riutilizzabile:
<?php
//definizione della funzione
function dividiImmagine($img, $parti)
{
$larghezza = imagesx($img);
$altezza = imagesy($img);
//calcoliamo la dimensione di ogni parte
$dimensione = round($larghezza / $parti);
//creaiamo un copia di immagine per ogni parte
for ($parte = 1; $parte < $parti; $parte++)
{
$immagini[$parte - 1] = imagecreate($dimensione, $altezza);
//creaiamo un array con le parti dell'immagine
imagecopy($immagini[$parte - 1], $img, 1, 1, $dimensione * ($parte - 1) + 1 , 1, $dimensione, $altezza);
}
//recuperariamo l'ultima porzione tagliata di immagine
$immagini[$parti - 1] = imagecreate($dimensione, $altezza);
imagecopy($immagini[$parti - 1], $img, 1, 1, $dimensione * ($parti - 1) + 1 , 1, $larghezza, $altezza);
//output
return $immagini;
}
//esempio di utilizzo della funzione
//definiamo l'immagine sorgente
$in_image = imagecreatefromjpeg('GnuTux.jpg');
$imgs = dividiImmagine($in_image, 4);
$contatore = 0;
//mostriamo le immagini contenute nell'array
foreach ($imgs as $img)
{
$contatore++;
imagejpeg($img, $contatore.'.jpg');
}
?>
Come è semplice notare, il nostro codice si suddivide in due parti, la prima relativa alla definizione della funzione, chimata dividiImmagine(), la seconda attinente all'utilizzo pratico della stessa.
La funzione dividiImmagine() accetta come parametri due variabili che devono essere valorizzate rispettivamente con il percorso al file grafico sorgente e con il numero delle parti in cui si desidera dividere quest'ultimo.
La prima operazione svolta dalla funzione e quella di reperire le informazioni relative all'altezza e alla larghezza dell'immagine di partenza, per far questo vengono utilizzate le funzioni native imagesx() e imagesy(): la prima restituisce la larghezza di un'immagine sulla base delle coordinate x (asse delle ascisse), la seconda svolge lo stesso compito sulla base delle coordinate y (asse delle ordinate).
Dato che vogliamo effettuare dei tagli in senso verticale, le dimensioni delle immagini vengono stabilite dividendo il valore relativo alla larghezza del sorgente per il numero di parti definite come parametro; otteniamo così un valore da passare alla funzione imagecreate() tramite un ciclo for che avrà come condizione di terminazione il numero definito di parti.
Nell'esempio pratico, riportato alla fine del codice, abbiamo stabilito che la nostra immagine sorgente dovrà essere suddivisa in 4 parti, applicando la funzione dovremo ricordarci del fatto che dividiImmagine() produce un array(), quindi l'output generato dovrà essere passato come argomento all'interno di un ciclo foreach.







