PHP  »  Articoli  »  Grafica e Php 

Immagini dinamiche: le estensioni GD in PHP

di: Andrea Cristaudo     28 Aprile 2005

Thumbnail

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.

Bordo

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
}

Watermark

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.

Caching

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.

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Zend Framework

Diventate professionisti dello sviluppo Web. Zend Framework è lo...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti