Sin dalla versione PHP 4.3 il supporto alla libreria GD è incluso tra i moduli di default di PHP. La storia della libreria è piuttosto controversa, perché nel passaggio dalle versioni 1.x alle 2.x è stato prima implementata, poi rimossa e infine ripristinata la gestione del formato GIF. Con PHP 5.x e la libreria GD 2.x (in breve GD2) le cose si sono finalmente assestate, ed è possibile sfruttare il modulo GD in modo semplice e flessibile, gestendo diversi formati di immagini, tra cui i più diffusi sul web: JPEG, GIF e PNG. In aggiunta alla libreria GD abbiamo a disposizione anche l'estensione exif, che permette di leggere e trattare i metadati contenuti nei formati JPEG e TIFF, utile soprattutto se dobbiamo sviluppare software in ambito fotografico professionale.

Le funzionalità più utili, negli scenari comuni, sono proprio le operazioni di base della libreria GD: iniziamo a vedere come utilizzarla, creando un'immagine di prova.

Configurazione e run-time

La libreria GD2 dovrebbe essere attiva per default, ma se vogliamo esserne sicuri controlliamo che la riga

extension=php_gd2.dll

non sia commentata nel nostro file php.ini. Finché lavoriamo in locale, o nell'ambiente di test, la configurazione runtime di PHP dovrebbe andare più che bene. Quando passiamo in produzione, è necessario disabilitare gli avvisi di errore, specificando

gd.jpeg_ignore_warning = 1

display_errors = Off

La scelta di “spegnere” la visualizzazione degli errori non è solo un fatto estetico, ma funzionale. Se qualcosa va storto durante le gestione di un'immagine, il modulo GD produce un messaggio d'errore a sua volta sotto forma di immagine, che è piuttosto difficile da riconoscere (i.e. leggere) lato codice: meglio evitare il problema a monte, disabilitando l'output dei messaggi d'errore.

Se vogliamo invece controllare la configurazione della libreria, abbiamo a disposizione un comando simile al famoso phpinfo(), che stampa a video versione e impostazioni del modulo GD

var_dump(gd_info());

Creazione di immagini

Un uso tipico della libreria GD è la produzione dinamica di immagini, che avranno un proprio URI, e saranno in tutto per tutto simili alle immagini “fisiche” raggiungibili attraverso un link HTML. Immagini di questo tipo, nel protocollo HTTP, vengono restituite specificando nell'header della risposta il Content-Type con valore image/png: Vediamo un esempio

$im = imagecreatetruecolor(200, 100) ;

$blue = imagecolorallocate($im, 0, 0, 255) ;

$white = imagecolorallocate($im, 255, 255, 255) ;

il codice qui sopra produce un'immagine, il cui riferimento è memorizzato nella variabile $im, e associa due colori all'immagine (blu e bianco). A questo punto possiamo riempire l'immagine con un rettangolo, per creare un effetto simile al padding, e poi scrivere un messaggio sull'immagine stessa

imagefilledrectangle($im, 10, 10, 190, 90, $white) ;

imagestring($im, 2, 20, 20, 'Hello World!', $blue) ;

il risultato sarà qualcosa del tipo

Immagine campione

Immagine campione

Ma come far comparire l'immagine appena creata? L'immagine è pronta all'uso, ma il codice visto finora ha creato l'immagine solamente come oggetto in memoria, riferito dalla variabile $im. Quello che manca, è la sezione che si occupa di renderizzare l'immagine, ovvero inviarla al browser.

Se vogliamo produrre un'immagine vera e propria, come detto sopra, basterà scrivere

header('Content-Type: image/png') ;

imagepng($im) ;

Che visualizza nel browser l'immagine, creando di fatto un URI (l'indirizzo della pagina PHP) del tutto simile all'URI di una qualsiasi immagine raggiungibile via HTTP. Qui sopra abbiamo usato la funzione imagepng per produrre l'immagine in formato PNG, ma chiaramente abbiamo a disposizione anche le funzioni imagegif e imagejpeg per gli altri formati. Se invece vogliamo creare l'immagine nel file system, producendo un nuovo file, scriviamo

imagepng($im, 'foo.png') ;

che salva l'immagine nel file foo.png. Anche in questo caso possiamo salvare l'immagine in altri formati, come visto sopra. Alla fine del lavoro, prima di lasciare la pagina, se non ci serve più la variabile $im è bene dire a PHP di distruggerne l'impronta in memoria

imagedestroy($im) ;

per liberare risorse e ottimizzare le prestazioni.