Librerie GD: manipolare le immagini con PHP (2/3)
Dopo la prima parte dedicata all’introduzione delle librerie GD da utilizzare in PHP per la creazione di immagini facciamo quest’oggi un passo avanti cercando di capire quali funzionalità vengono messe a disposizione dalla librerie stesse per la manipolazione di immagini esistenti. Effettueremo quindi delle operazioni su alcune immagini d’esempio per ottenerne delle altre con differenze significative.
Se non avete letto il primo articolo introduttivo all’utilizzo delle librerie GD di PHP consiglio caldamente di impegnare alcuni minuti per apprendere quelle che sono le basi per lo sfruttamente delle funzioni che andremo a vedere in questa seconda puntata.
La prima funzionalità che vediamo quest’oggi è sicuramente quella più utilizzata in ambito grafico, parliamo del semplice ridimensionamento delle immagini che a partire da un’immagine A permette di ottenere l’immagine B di dimensioni specificate (mantenendo le proporzioni) in base alle proprie esigenze. Vediamo un semplice esempio prima di analizzare le singole chiamate alle funzioni:
<?php
$w = 1600;
$h = 1200;
$src = 'image.jpg';
$size = getimagesize($src);
$im = @imagecreatefromjpeg($src);
$newwidth = $size[0];
$newheight = $size[1];
if( $newwidth > $w ){
$newheight = ($w / $newwidth) * $newheight;
$newwidth = $w;
}
if( $newheight > $h ){
$newwidth = ($h / $newheight) * $newwidth;
$newheight = $h;
}
$new = imagecreatetruecolor($newwidth, $newheight);
imagecopyresized($new, $im, 0, 0, 0, 0, $newwidth, $newheight, $size[0], $size[1]);
header('Content-Type: ' . $size['mime']);
@imagejpeg($new, '', 100);
@imagedestroy($im);
@imagedestroy($new);
?>
imagecreatefromjpeg() restituisce l’handler all’immagine passata come parametro nella chiamata della funzione. E’ questa sorta di puntatore ad essere usato al posto dell’immagine vera e propria per tutte le operazioni seguenti.
imageCopyResized() è la classica funzione per il ridimensionamento delle immagini specialmente per la creazione di thumbnail. Copia una porzione rettangolare dell’immagine di partenza nell’immagine di arrivo modificandone le dimensioni ed apportando le dovute trasformazioni nel caso in cui le dimensioni non coincidessero.
imagejpeg() si occupa dell’output finale dell’immagine appena creata.
A volte però mantenere le proporzioni dell’immagine può non andare bene, ecco quindi che si rende necessario eseguire un “crop” dell’immagine per catturarne una sola porzione e presentarla in un formato particolare per la visualizzazione. Si pensi ad una griglia dove si vogliano presentare le immagini in forma quadrata, le immagini originali dovranno essere sfruttate per crearne delle nuove adatte all’utilizzo che ne vogliamo fare.
<?php
$l = 160;
$src = 'image.jpg';
$size = getimagesize($src);
$im = @imagecreatefromjpeg($src);
if( $size[0]>$l or $size[1]>$l ){
$centerX = $size[0]/2;
$centerY = $size[1]/2;
if( $size[0] > $size[1] ){
$luy = 0;
$lux = $centerX-$centerY;
$rdy = $size[1];
$rdx = $size[1];
}
else{
$lux = 0;
$luy = $centerY-$centerX;
$rdx = $size[0];
$rdy = $size[0];
}
$new = imagecreatetruecolor($l, $l);
imagecopyresampled($new, $im, 0, 0, $lux, $luy, $l, $l, $rdx, $rdy);
}
else{
$new &= $im;
}
header('Content-Type: ' . $size['mime']);
@imagejpeg($new, '', 100);
@imagedestroy($im);
@imagedestroy($new);
?>
In questo secondo caso introduciamo anche una nuova funzione:
imagecopyresampled() si comporta come imagecopyresized() aggiungendo però un livello di interpolazione che mantiene una buona qualità dei dettagli anche nel caso in cui la dimensione dell’immagine diminuisca in modo significativo.
Abbiamo dunque visto come ridimensionare le immagini ed eseguire dei crop per la creazione di miniature sfruttando le librerie GD. Chiaramente le variazioni sul tema possono essere molte e qui ci siamo limitati ad illustrare la strada più breve e semplice al fine di dare un qualcosa di pratico da cui partire a sviluppare i vostri test per le applicazioni.
Come sempre siete invitati ad usare i commenti per chiedere ulteriori informazioni, fornire suggerimenti o fare critiche a quanto scritto. Siete i benvenuti.





Commenti
Librerie GD: manipolare le immagini con PHP (2/3)…
Dopo la prima parte dedicata all’introduzione delle librerie GD da utilizzare in PHP per la creazione di immagini facciamo quest’oggi un passo avanti cercando di capire quali funzionalità vengono messe a disposizione dalla librerie stesse per la m…
Questo articolo è stato segnalato su ZicZac.it….
…
Ciao, articolo molto ben fatto e chiaro!
Ho una domanda: se io invece di un’immagine quadrata la volessi rettangolare, mettiamo 160×120, cosa doverei fare?
Ciao Delio grazie per il commento. Per quello che chiedi tu dovresti agire qui:
$new = imagecreatetruecolor($l, $l);
imagecopyresampled($new, $im, 0, 0, $lux, $luy, $l, $l, $rdx, $rdy);
Come vedi nella creazione della nuova immagine passiamo lo stesso valore per larghezza e altezza ($l), nel tuo caso dovresti passare 160 e 120:
$new = imagecreatetruecolor(160, 120);
Inoltre dovresti anche specificare tali dimensioni a imagecopyresampled per fare in modo di ritagliare la porzione corretta di immagine:
imagecopyresampled($new, $im, 0, 0, $lux, $luy, 160, 120, $rdx, $rdy);
Ecco fatto. Qui chiaramente io ho passato i valori direttamente ma per comodità li puoi benissimo impostare altrove e poi richiamarli…
Scusa, non avevo letto la risposta! Non era esattamente quello che chiedevo, ma grazie lo stesso, ho risolto in altro modo.