Nel mio precedente tutorial, abbiamo discusso la manipolazione delle immagini di base usando la libreria GD di PHP. In quel tutorial, ho fatto una breve introduzione alla libreria e ti ho mostrato come caricare le immagini da un file o crearle da zero in PHP. Successivamente, abbiamo imparato come ritagliare, ruotare, ridimensionare e capovolgere un'immagine usando GD. Ho coperto il ImageFilter ()
funzione per applicare diversi filtri alle risorse di immagine caricate nello script. Ho anche menzionato alcune funzioni utili in GD come imagesx ()
e imagesy ()
per ottenere la larghezza e l'altezza dell'immagine caricata.
Alla fine del mio ultimo tutorial su GD, hai imparato come utilizzare la libreria per automatizzare attività di base come ridimensionare tutte le immagini in una directory o applicare filtri come la scala di grigi su di esse prima di salvare il risultato finale. Se non hai mai usato la libreria GD di PHP prima, ti suggerirei di passare attraverso l'articolo introduttivo di GD prima di leggere questo.
In questo tutorial, apprenderemo su molte altre utili funzioni in GD e su come possono essere utilizzate per automatizzare molte delle nostre attività di manipolazione delle immagini.
Ad eccezione dei pixel ai bordi, ogni pixel di un'immagine è circondato da altri otto pixel. Gli effetti come la sfocatura o il rilevamento dei bordi vengono calcolati per ciascun pixel in base al valore di quel pixel e ai valori dei pixel circostanti. Nel rilevamento dei bordi, ad esempio, un netto cambiamento nel colore implica che abbiamo raggiunto il bordo di alcuni oggetti nell'immagine. Ad esempio, un cambiamento improvviso da bianco a marrone nell'immagine sottostante indica il limite della tazza e del tavolo.
Un modo semplice per specificare questo tipo di filtro è con quella che viene chiamata una "matrice di convoluzione". GD fornisce il imageconvolution ($ image, $ matrix, $ div, $ offset)
funzione per applicare una matrice di convoluzione 3x3 a una risorsa immagine $ image
.
Il $ matrix
parametro è una matrice di tre matrici, ognuna delle quali contiene tre valori float, cioè. è una matrice 3x3. Il primo elemento del primo array viene moltiplicato per il valore del colore del pixel in alto a sinistra. Allo stesso modo, il secondo elemento del primo array viene moltiplicato per il valore del colore del pixel direttamente sopra il pixel centrale. Il colore finale del pixel si ottiene aggiungendo il risultato di tutte queste moltiplicazioni e quindi dividendolo per $ div
per la normalizzazione. Normalmente la normalizzazione mantiene il valore del colore finale inferiore a 255.
Come abbiamo visto, il $ div
parametro viene utilizzato come divisore per il risultato della convoluzione per normalizzarne il valore. Il $ Offset
il parametro, d'altra parte, viene utilizzato per specificare un valore di offset per tutti i colori. Vedrai come influisce sul risultato finale negli esempi di seguito.
Ecco una lista di alcune matrici di convoluzione diverse che abbiamo applicato all'immagine di una tazza su un tavolo.
$ box_blur = array ([1, 1, 1], [1, 1, 1], [1, 1, 1]); imageconvolution ($ im_php, $ box_blur, 9, 0);
La sfocatura a riquadri funziona calcolando la media di ciascun pixel con i suoi vicini. Impostiamo il valore del divisore su 9 perché la somma di tutti gli elementi nei tre array è 9.
$ sharpen = array ([0, -1, 0], [-1, 5, -1], [0, -1, 0]); imageconvolution ($ im_php, $ sharpen, 1, 0);
La nitidezza funziona esagerando le differenze tra ciascun pixel e i suoi vicini. Questo rende i bordi un po 'più chiari. Nel caso di sharpen, il divisore è ancora 1 perché la somma di tutti gli elementi nei tre array è 1.
$ emboss = array ([- 2, -1, 0], [-1, 1, 1], [0, 1, 2]); imageconvolution ($ im_php, $ emboss, 1, 0);
La matrice di rilievo è simile alla matrice di sharpen, tranne per il fatto che i valori sono negativi in alto a sinistra e positivi in basso a destra: questo è ciò che crea l'effetto rilievo. La somma di tutti gli elementi nel caso della matrice di convoluzione di rilievo è 1, quindi non dobbiamo preoccuparci della normalizzazione o dell'offset del colore.
$ edge_detect = array ([- 1, -1, -1], [-1, 8, -1], [-1, -1, -1]); imageconvolution ($ im_php, $ edge_detect, 1, 0); imageconvolution ($ im_php, $ edge_detect, 1, 255);
Il rilevamento dei bordi è simile alla nitidezza, ma l'effetto è ancora più forte. Inoltre, il valore originale dell'immagine non ha più peso dei vicini, il che significa che ci interessano solo i bordi, non le aree in tinta unita originali.
Con il rilevamento dei fronti, la somma di tutti gli elementi dell'array è 0. Ciò significa che l'immagine che otterremo sarà per lo più nera a meno che non vi sia un netto cambiamento nel colore, che generalmente si verifica ai bordi degli oggetti. L'immagine per lo più nera può essere trasformata in bianco impostando il parametro offset su 255.
L'immagine seguente mostra il risultato di tutte queste matrici di convoluzione.
PHP GD ha molte funzioni per copiare parte di un'immagine e poi ridimensionarla o unirla. Quando si utilizzano queste funzioni, è importante ricordare che PHP considera l'angolo in alto a sinistra di una risorsa immagine come origine. Un positivo X il valore ti porterà a destra dell'immagine e un positivo y il valore ti porterà più in basso.
La più semplice di queste funzioni è imagecopy ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ src_w, $ src_h)
. Copierà l'immagine sorgente su un'immagine di destinazione. Il $ dst_x
e $ dst_y
i parametri determinano l'angolo in alto a sinistra, dove verrà incollata l'immagine copiata. Il $ src_x
, $ src_y
, $ src_w
, e $ src_h
i parametri determinano la porzione rettangolare dell'immagine sorgente, che verrà copiata nella destinazione.
È possibile utilizzare questa funzione per ritagliare le immagini creando un'immagine da zero utilizzando imagecreatetruecolor ()
e copiando il rettangolo di ritaglio dell'immagine di origine in esso. Puoi anche usarlo per aggiungere filigrane sulle immagini, ma devi ricordare che con questo metodo, la dimensione della filigrana non può essere cambiata in base alla dimensione delle nostre immagini.
Una soluzione a questo problema è usare il imagecopyresized ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ dst_w, $ dst_h, $ src_w, $ src_h)
funzione. Accetta tutti i parametri di imagecopy ()
e due ulteriori parametri per determinare la dimensione dell'area di destinazione in cui verrà copiata l'immagine sorgente.
Il imagecopyresized ()
la funzione non è perfetta, in quanto non ottimizza l'immagine su e giù molto bene. Tuttavia, è possibile ottenere un ridimensionamento di qualità migliore utilizzando il imagecopyresampled ()
funzione, che accetta tutti gli stessi parametri.
Ci sono altre due funzioni relative alla copia delle immagini che troverai molto utili: imagecopymerge ()
e imagecopymergegray ()
.
La funzione imagecopymerge ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ src_w, $ src_h, $ pct)
è simile a imagecopy ()
, dove l'aggiuntivo $ PCT
parametro determina la trasparenza dell'immagine copiata. Un valore di 0 significa assenza di trasparenza e un valore di 100 significa trasparenza completa. Questo sarà di grande aiuto quando non vuoi nascondere completamente il contenuto dell'immagine principale dietro la tua filigrana.
Il imagecopymergegray ()
la funzione, d'altra parte, utilizza l'ultimo parametro per convertire l'immagine sorgente in scala di grigi. Se è impostato su 0, l'immagine sorgente perderà tutto il suo colore. Se è impostato su 100, l'immagine sorgente rimarrà inalterata.
Nell'esempio seguente viene utilizzato il imagecopy ()
funzione per trasformare la metà destra di un'immagine nel suo negativo. Abbiamo già discusso di altre funzioni come ImageFilter ()
e imagescale ()
utilizzato in questo snippet di codice nel tutorial precedente.
$ im_php = imagecreatefromjpeg ('fish-mosaic.jpg'); $ im_php = imagescale ($ im_php, 800); $ im_php_inv = imagescale ($ im_php, 800); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); imagefilter ($ im_php_inv, IMG_FILTER_NEGATE); imagecopy ($ im_php, $ im_php_inv, $ im_width / 2, 0, $ im_width / 2, 0, $ im_width / 2, $ im_height); $ new_name = 'fish-mosaic-half-negate.jpg'; imagejpeg ($ im_php, $ new_name);
Qui, creiamo due copie dell'immagine originale, ognuna delle quali è stata ridimensionata per essere larga 800 pixel. Dopo ciò, usiamo il ImageFilter ()
funzione per creare un negativo del $ img_php_inv
risorsa immagine La metà destra di questa immagine negativa viene quindi copiata sull'immagine originale usando il imagecopy ()
funzione.
Questo era un uso molto basilare del imagecopy ()
funzione. Puoi vedere i risultati qui sotto. Puoi anche dividere l'immagine in sezioni più piccole o strisce per creare effetti di immagine più interessanti. Useremo il imagecopymergegray ()
funzione nello snippet di codice qui sotto per creare molte più strisce nell'immagine originale del pesce.
$ im_php = imagecreatefromjpeg ('fish-mosaic.jpg'); $ im_php = imagescale ($ im_php, 800); $ im_php_bw = imagescale ($ im_php, 800); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); $ strisce = 200; per ($ i = 0; $ i < $stripes; $i++) if($i%2 == 0) imagecopymergegray($im_php, $im_php_bw, $i*$im_width/$stripes, 0, $i*$im_width/$stripes, 0, $im_width/$stripes, $im_height, 0); else imagecopymergegray($im_php, $im_php_bw, $i*$im_width/$stripes, 0, $i*$im_width/$stripes, 0, $im_width/$stripes, $im_height, 100); imagefilter($im_php, IMG_FILTER_CONTRAST, -255); imagefilter($im_php, IMG_FILTER_COLORIZE, 250, 0, 0, 100); $new_name = 'fish-mosaic-stripes.jpg'; imagejpeg($im_php, $new_name);
L'esempio di codice precedente utilizza una strategia simile all'esempio precedente, ma questa volta abbiamo diviso l'immagine in strisce più piccole, che sono state trasformate in scala di grigi o mantenute invariate in base al valore della variabile $ i
. Dopo aver completato tutte le operazioni di copia unione, applichiamo due filtri sull'immagine per far risaltare le strisce.
L'immagine seguente mostra il risultato finale di queste due funzioni in combinazione con diversi filtri di immagine.
Alcune organizzazioni aggiungono filigrane alle loro immagini per rendere chiaro che possiedono l'immagine. Aiuta anche con il riconoscimento del marchio e scoraggia gli altri dalla copiatura sfacciata delle immagini. Grazie a PHP GD, le immagini con filigrana sono un compito semplice.
$ im_php = imagecreatefromjpeg ('waterfall.jpg'); $ watermark = imagecreatefrompng ('watermark.png'); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); $ watermark = imagescale ($ watermark, $ im_width / 5); $ wt_width = imagesx ($ watermark); $ wt_height = imagesy ($ watermark); imagecopy ($ im_php, $ watermark, 0,95 * $ im_width - $ wt_width, 0,95 * $ im_height - $ wt_height, 0, 0, $ wt_width, $ wt_height); $ new_name = 'waterfall-watermark.jpg'; imagejpeg ($ im_php, $ new_name);
Nello snippet di codice precedente, abbiamo creato due diverse risorse di immagine utilizzando imagecreatefromjpeg ()
per l'immagine principale e imagecreatefrompng ()
per la filigrana, rispettivamente. Determiniamo la larghezza e l'altezza dell'immagine principale usando il imagesx ()
e imagesy ()
funzioni.
Non tutte le immagini che vuoi filigranare avranno le stesse dimensioni. Se non ridimensiona la filigrana in base alle dimensioni dell'immagine principale, potrebbe sembrare strana. Ad esempio, una filigrana 200px può sembrare buona su un'immagine 1000px, ma sarà troppo grande per un'immagine di 600px e potrebbe sembrare troppo piccola su un'immagine larga 2400px.
Pertanto, usiamo il imagescale ()
funzione per mantenere sempre la filigrana a un quinto della larghezza dell'immagine originale. Quindi usiamo il imagecopy ()
funzione per posizionare la filigrana nella giusta posizione. Ecco il risultato finale dello snippet di codice sopra riportato.
Oltre alle filigrane, puoi aggiungere altre informazioni come il luogo in cui è stata scattata una foto o il momento in cui è stata scattata una foto.
Dopo aver trattato le nozioni di base sulla manipolazione delle immagini nel nostro tutorial precedente, abbiamo appreso alcune altre utili funzioni nella libreria GD. La prima parte del tutorial ha discusso di come possiamo manipolare le immagini in PHP usando la matrice di convoluzione. Ho anche mostrato alcuni esempi dell'operazione della matrice di convoluzione per aiutarti a capire come PHP arriva ai valori cromatici di diversi pixel.
La seconda parte del tutorial spiega come copiare e / o ridimensionare parte di un'immagine per incollarla da qualche altra parte. Questo è utile quando vogliamo aggiungere qualcosa a un'immagine come una filigrana o un timestamp.
Prova a utilizzare tutte queste funzioni per creare alcuni effetti di immagine interessanti!