PHP » Articoli » Grafica e Php
di: Andrea Cristaudo 28 Aprile 2005
Vediamo ora un uso comune delle librerie GD: la creazione di gallerie di thumbnail come anteprime di dimensioni ridotte mantenendo intatte le proporzioni dell'immagine.
function OutThumb($src, $w, $h){
$size = getimagesize($src);
if( $size[2] == 2 ){$im = @imagecreatefromjpeg($src);}
elseif( $size[2] == 1 ){$im = @imagecreatefromgif($src);}
elseif( $size[2] == 3 ){$im = @imagecreatefrompng($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;
}
if( (GDVersion() == 2) AND ($size[2] != 1) ){
$new = imagecreatetruecolor($newwidth, $newheight);
imagecopyresampled($new, $im, 0, 0, 0, 0, $newwidth, $newheight, $size[0], $size[1]);
}
else{
$new = imagecreate($newwidth, $newheight);
imagecopyresized($new, $im, 0, 0, 0, 0, $newwidth, $newheight, $size[0], $size[1]);
}
header('Content-Type: ' . $size['mime']);
if( $size[2] == 2 ){@imagejpeg($new, '', 100);}
elseif( $size[2] == 1 ){@imagegif($new);}
elseif( $size[2] == 3 ){@imagepng($new);}
@imagedestroy($im);
@imagedestroy($new);
}
A volte può risultare utile creare delle thumbnail di forma quadrata (ad esempio per averle tutte nelle stesse proporzioni). Ecco un esempio di creazione di thumbnail quadrate, viene ritagliata la parte centrale più grande possibile e ridimensionata alla dimensione $l fornita.
function OutThumb($src, $l){
$size = getimagesize($src);
if( $size[2] == 2 ){$im = @imagecreatefromjpeg($src);}
elseif( $size[2] == 1 ){$im = @imagecreatefromgif($src);}
elseif( $size[2] == 3 ){$im = @imagecreatefrompng($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];
}
if( (GDVersion() == 2) AND ($size[2] != 1) ){
$new = imagecreatetruecolor($l, $l);
imagecopyresampled($new, $im, 0, 0, $lux, $luy, $l, $l, $rdx, $rdy);
}
else{
$new = imagecreate($l, $l);
imagecopyresized($new, $im, 0, 0, $lux, $luy, $l, $l, $rdx, $rdy);
}
}
else{
$new &= $im;
}
header('Content-Type: ' . $size['mime']);
if( $size[2] == 2 ){@imagejpeg($new, $fileOut, 100);}
elseif( $size[2] == 1 ){@imagegif($new, $fileOut);}
elseif( $size[2] == 3 ){@imagepng($new, $fileOut);}
@imagedestroy($im);
@imagedestroy($new);
}
Bisogna sottolineare il fatto che questo processo occupi pesantemente le risorse del sistema e quindi è caldamente consigliabile di utilizzarlo insieme ad un processo di caching.
Un'altro effetto interessante da applicare ad un'immagine è l'inserimento di un bordo esterno. Questo effetto è realizzabile facilmente con la funzione imagerectangle.
function ApplicaBordo(&$imres){
$h = imagesy($imres)-1;
$w = imagesx($imres)-1;
$white = imagecolorallocate($imres, 255, 255, 255);
$black = imagecolorallocate($imres, 0, 0, 0);
imagerectangle($imres, 0, 0, $w, $h, $black); // Bordo composto da una linea esterna nera
imagerectangle($imres, 1, 1, $w-1, $h-1, $white); // e da una linea interna bianca
}
Questo codice ha però un problema quando si lavora con immagini PNG con il canale alpha attivato, in quanto gli angoli sarebbero sottoposti ad una sovrapposizione di linee. Andiamo quindi a creare una nostra funzione imagemyrectangle() che richiameremo al posto di imagerectangle() per evitare questo comportamento.
function imagemyrectangle(&$imgres, $x1, $y1, $x2, $y2, $col){
imageline($imgres, $x1, $y1, $x2-2, $y1, $col ); //top
imageline($imgres, $x1+1, $y2-1, $x2, $y2-1, $col ); //bottom
imageline($imgres, $x2-1, $y1, $x2-1, $y2-2, $col ); //right
imageline($imgres, $x1, $y1+1, $x1, $y2, $col ); //left
}
Anche l'applicazione di un watermark, cioè di un'immagine salvata sopra all'originale per impedirne un utilizzo al di fuori dei termini di licenza è un'operazione abbastanza semplice con le librerie GD.
function AddWaterMark(&$imgres, &$imgWM){
imageCopyMerge($imgres, $imgWM, 5, 5, 0, 0, imageSX($imgWM), imageSY($imgWM), 50);
}
È sufficiente richiamare la funzione passando come primo argomento la risorsa d'immagine (quella restituita da una delle funzioni imagecreatefrom*() per esempio) su cui vogliamo applicare il watermark e come secondo la risorsa del watermark stesso. In questo caso abbiamo inserito l'immagine a 5 pixel dal margine superiore e da quello laterale sinistro.
Concludiamo questo articolo dando uno spunto di riflessione: le librerie GD occupano molte risorse del sistema in cui vanno ad operare ed è quindi bene pensare ad un sistema di caching già in fase di progettazione.
Un semplice sistema di caching dovrebbe includere un controllo all'inizio dello script per verificare l'esistenza della copia cache precedentemente creata, fallito il quale verrebbe avviato il processo vero e proprio di creazione e modifica (quello che occupa maggiormente le risorse). Si possono anche ipotizzare sistemi più avanzati che includano nella loro attuazione un accesso al file di configurazione del server web, ad esempio facendo partire lo script di creazione immagine alla richiesta di una non esistente.
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |