PHP/Programmazione/Immagini
Tra le funzionalità del PHP esiste anche quella di creare dinamicamente immagini e restituire un output non quindi di testo (come può essere quello dell'HTML) ma di immagine.
Per fare ciò è possibile usare le librerie GD, delle librerie open-source sviluppate dalla Boutell. È possibile avere maggiori informazioni sull'argomento sul sito ufficiale.
Prima di procedere quindi alla creazione di immagini con PHP, si verifichi ovviamente di avere installato le librerie GD sul proprio computer.
Per creare quindi una nuova immagine in PHP dovremmo quindi:
- caricare in memoria una nuova immagine o una copia di un'immagine esistente
- caricare (si dice allocare) i colori usati per le eventuali modifiche dell'immagine
- eseguire eventuali modifiche (creare linee, punti, riempimenti, aggiungere testo...)
- restituire come output un'immagine dopo aver correttamente impostato nell'header il tipo di file restituito
- distruggere successivamente l'immagine, per liberare la memoria.
Creare una nuova immagine
modificaPer la creazione di una nuova immagine PHP mette a disposizione diverse funzioni. Per creare un'immagine ex-novo usiamo la funzione:
imagecreatetruecolor(h, w)
che crea in memoria una nuova immagine di altezza h
e larghezza w
(in pixel) e restituisce un riferimento all'immagine appena creata. Esiste anche una funzione, seppur non raccomandata, che crea un'immagine con una minore ampiezza di colori: imagecreate
, che ha lo stesso comportamento di imagecreatetruecolor
.
Per caricare in memoria un'immagine salvata su disco usiamo invece le funzioni
imagecreatefrom<tipo> (percorso)
che carica un'immagine salvata sul server del tipo specificato. Ad esempio:
$img = imagecreatefrompng('immagine.png');
Esiste inoltre una funzione
imagecreatefromstring (testo)
che crea un'immagine contenente il testo specificato come argomento
Nei casi avvenga un errore, le funzioni restituiscono false
.
Lavorare con i colori
modificaPer allocare un colore si usa la funzione
imagecolorallocate(immagine,r,g,b)
che restituisce un riferimento al colore date le sue componenti RGB.
È possibile, se si sta lavorando con formati come il PNG (che supporta la trasparenza), allocare colori trasparenti con la funzione imagecolortransparent
imagecolortransparent(immagine,colore)
dove colore
è una risorsa colore valida creata con imagecolorallocate
; è anche possibile allocare colori con una determinata trasparenza, compresa tra 0 (opaco) e 127 (completamente trasparente) con la funzione
imagecolorallocatealpha(immagine,r,g,b,trasparenza)
Si noti che il primo colore allocato verrà automaticamente usato come colore di sfondo dell'immagine.
Creata la nuova immagine e allocati i colori, è ora possibile lavorarci sopra in due modi:
- disegnando nuovi pixel (creando linee, forme, ecc...)
- lavorando sui pixel già esistenti (serve se l'immagine è stata caricata da un file) tagliandone parti, ricolorandola o ridimensionandola)
Disegnare punti, linee e forme
modificaPer disegnare un pixel usiamo la funzione
imagesetpixel(immagine, x, y, colore)
dove immagine
è una risorsa di immagine, x
e y
sono le coordinate del punto da disegnare e colore
è una risorsa che identifica un colore allocato in precedenza.
imageline(immagine, x1, y1, x2, y2, colore)
Traccia una linea dal punto x1, y1 al punto x2, y2
imagerectangle(immagine, x1, y1, x2, y2, colore)
Disegna un rettangolo che ha per diagonale la linea da x1, y1 a x2, y2.
imageellipse(immagine, x, y, w, h, colore)
Disegna una ellisse di centro x, y di altezza h e larghezza w. Se h è uguale a w, allora si otterrà un cerchio.
imagearc(immagine, x, y, w, h, ang1, ang2, colore)
Funzione come imageellipse
ma disegna solo l'arco di ellisse compreso tra gli angoli (in gradi) ang1 e ang2, I gradi sono contati in senso orario a partire dalle ore 3.
Lavorare sui pixel già esistenti
modificaPer lavorare su un'immagine già disegnata in precedenza, ad esempio una foto, si hanno a disposizione molte funzioni.
Una delle più utilizzate è sicuramente imagecopyresized
, che permette di copiare una porzione rettangolare di un'immagine ed incollarla in un'altra (con possibilità di ridimensionarla durante il processo). Es:
imagecopyresized(dst_image, src_image, dst_x, dst_y, src_x,
src_y, dst_w, dst_h, src_w, src_h);
dove:
dst_image
è l'immagine dove verrà incollatadst_x, dst_y
sono le coordinate X e Y didst_image
dove verrà incollata la porzione di immagine;src_x, src_y
sono le coordinate X e Y disrc_image
che corrispondono all'angolo in alto a sinistra del rettangolo da copiare;dst_w, dst_h, src_w, src_h
sono invece rispettivamente larghezza e altezza dell'immagine rettangolare che sarà incollata e larghezza e altezza dell'immagine rettangolare da copiare.
Si può quindi capire che se dst_w è uguale a src_w e dst_h è uguale a src_h, la porzione rettangolare dell'immagine resterà della stessa misura, in caso contrario l'immagine risulterà allungata e/o allargata.
La funzione imagecopyresampled
riceve gli stessi parametri di imagecopyresized
, con la differenza che, in caso di ridimensionamento, la qualità è migliore.
Esiste poi la funzione imagefilter
, che permette numerosi effetti quali la scala di grigio, l'incassato, la ricolorazione: per la sua complessità, rimando al manuale ufficiale, dove è possibile trovare funzionamento ed esempi.
Stampare l'output
modificaPrima di stampare l'output del risultato ottenuto è necessario indicare, usando la funzione header
, il content-type (tipo del contenuto, che per default è impostato a text/html); quindi:
header("Content-type: image/<tipo>");
dove tipo
sta per "png", "jpeg" o "gif" a seconda del formato in cui si vuole visualizzare l'immagine.
Per visualizzare l'immagine, secondo il tipo scelto in precedenza, usare la funzione imagepng
, imagejpeg
o imagegif
, che prendono come parametro la risorsa immagine da visualizzare.
Infine occorre liberare la memoria, che è stata occupata dall'immagine, con la funzione imagedestroy
, che prende come unico parametro la risorsa immagine da distruggere.
Sebbene l'omissione di questa procedura non provochi la visualizzazione di errori da parte di PHP, è fortemente consigliata soprattutto quando si usano immagini piuttosto grandi.
Esempio
modificaPer visualizzare un quadrato rosso in un nero:
$image = imagecreatetruecolor(100, 100);
$color = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image,0,0,50,50,$color);
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);