# PHP/Programmazione/Immagini

PHP
Copertina Tutti i moduli · Sviluppo
    CopertinaPHP/Copertina
* IntroduzionePHP/Introduzione
** StoriaPHP/Introduzione/Storia
** Come funzionaPHP/Introduzione/Come funziona
* Installazione e configurazionePHP/Installazione e configurazione
** InstallazionePHP/Installazione
*** LinuxPHP/Installazione/Linux
*** WindowsPHP/Installazione/Windows
*** Mac OS XPHP/Installazione/Mac OS X
** ConfigurazionePHP/Configurazione
* ProgrammazionePHP/Programmazione
** CommentiPHP/Programmazione/Commenti
** VariabiliPHP/Programmazione/Variabili
** OperatoriPHP/Programmazione/Operatori
** ArrayPHP/Programmazione/Array
** CondizioniPHP/Programmazione/Condizioni
** CicliPHP/Programmazione/Cicli
** Funzioni di basePHP/Programmazione/Funzioni di base
** Funzioni personalizzatePHP/Programmazione/Funzioni personalizzate
** Variabili globaliPHP/Programmazione/Variabili globali
*** $GLOBALSPHP/Programmazione/Variabili globali/$GLOBALS
*** $_GETPHP/Programmazione/Variabili globali/$_GET
*** $_POSTPHP/Programmazione/Variabili globali/$_POST
*** $_SESSIONPHP/Programmazione/Variabili globali/$_SESSION
*** $_COOKIEPHP/Programmazione/Variabili globali/$_COOKIE
*** $_SERVERPHP/Programmazione/Variabili globali/$_SERVER
** FilePHP/Programmazione/File
** ImmaginiPHP/Programmazione/Immagini
** Espressioni regolariPHP/Programmazione/Regexp
** Programmazione orientata agli oggettiPHP/Programmazione/OOP
* Programmazione avanzata con le classi PEARPHP/PEAR
* PHP e i databasePHP/Database
** Funzioni PHP per l'accesso ai database
*** Funzioni MySQLPHP/Programmazione/MySQL
**** Accesso al databasePHP/Programmazione/MySQL/Accesso al database
**** QueryPHP/Programmazione/MySQL/Query
**** Risultati di una queryPHP/Programmazione/MySQL/Risultati di una query
**** Liberare memoria dai risultati di una queryPHP/Programmazione/MySQL/Liberare memoria dai risultati di una query
**** Chiudi connessione al dbPHP/Programmazione/MySQL/Chiudi connessione al db
*** Funzioni PostgreSQLPHP/PostgreSQL
**** Accesso al database
**** Query
**** Risultati di una query
*** Funzioni Sqlite
**** Accesso al database
**** Query
**** Risultati di una query
** Database e object oriented
*** Abstraction Layers
**** PDO - Php Data Objects
**** PEAR::MDB2
**** Creole
*** Object Relational Mapping (ORM)
**** PEAR:DB_DataObject
**** PEAR:DB_Table
**** Propel
* PHP Design PatternPHP/PHP Design Pattern
* SmartyPHP/Smarty
* Sicurezza delle applicazioni web
* PHP CLI: Command Line InterpreterPHP/Cli
* PHP GTK2: applicazioni desktop in PHPPHP/Gtk
* Crediti
Modifica il sommario
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

Per la creazione di una nuova immagine PHP mette a disposizione diverse funzioni. Per creare un'immagine ex-novo usiamo la funzione:
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
che carica un'immagine salvata sul server del tipo specificato. Ad esempio:
Esiste inoltre una funzione
che crea un'immagine contenente il testo specificato come argomento
Nei casi avvenga un errore, le funzioni restituiscono false.

## Lavorare con i colori

Per allocare un colore si usa la funzione
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
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
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

Per disegnare un pixel usiamo la funzione
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.
Traccia una linea dal punto x1, y1 al punto x2, y2
Disegna un rettangolo che ha per diagonale la linea da x1, y1 a x2, y2.
Disegna una ellisse di centro x, y di altezza h e larghezza w. Se h è uguale a w, allora si otterrà un cerchio.
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

Per 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:
dove:
* dst_image è l'immagine dove verrà incollata
* dst_x, dst_y sono le coordinate X e Y di dst_image dove verrà incollata la porzione di immagine;
* src_x, src_y sono le coordinate X e Y di src_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

Prima 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:
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

Per visualizzare un quadrato rosso in un nero: