PHP

Resize, crop e cache immagine al volo

Capita spesso durante la realizzazione di un sito web interattivo di permettere l'upload di immagini da parte di utenti per poi andarle a visualizzare in diversi formati su varie pagine del sito.

Ovviamente da evitare è il ridimensionamento tramite attributi width e height del tag img piuttosto che da stile CSS, che richiederebbero comunque il download dell'immagine di dimensioni più grandi incidendo sulla velocità di visualizzazione dell'immagine stessa. Una possibilie strada è il ridimensionamento al momento dell'upload secondo i formati che ci serviranno, ma è piuttosto ristrettivo per il futuro: se cambiassimo idea e su una data pagina non volessimo più quel formato?

La soluzione migliore è salvare l'immagine originale al momento dell'upload, per poi prima della visualizzazione andare a fare un resize e/o crop al volo ed includere quest'immagine nella pagina richiesta, prevedendo anche un sistema di caching. Per fare tutto ciò ci basta l'utilizzo di un'unica ma potente funzione PHP, sviluppata da Wes Edling, che puoi scaricare dal suo repository GitHub: https://github.com/wes/phpimageresize.

La funzione in questione è resize(). Ecco un esempio di come utilizzarla:

View source
<?php
include 'function.resize.php'; // include funzione resize()
?>
 
<!-- visualizzazione immagine ridimensionata con eventuale crop -->
<img src="<?php echo resize('uploads/user_image.jpg', array('w'=>300,'h'=>300,'crop'=>true)); ?>" />
 

Veramente semplice ed immediato. Vero?

Ecco qui altri esempi di utilizzo direttamente dal sito di Wes Edling: http://joedesigns.com/resizing/

Unico "impiccio" da segnalare è che la procedura utlizza da exec il comando convert di ImageMagick che se siete su hosting Linux dovrebbe essere già disponibile, ma se state testando lo script in locale su Windows, dovrete installarlo dopo aver scaricato il relativo setup da http://www.imagemagick.org/.

Hosting che non permettono comandi da exec()

In caso di hosting condiviso che non permette l'utilizzo del comando PHP exec(), ho scritto questo codice che, al posto del comando ImageMagick da shell, utilizza la relativa estensione PHP (solitamente disponibile anche su hosting condiviso).
Il codice va sostituito a quello contenuto in if($create == true): nella parte finale dello script.

View source
// s2s Use Imagick class (hosting with exec() disabled)
if (empty($w)) $w = 0;
if (empty($h)) $h = 0;
 
$imagick = new Imagick(realpath($imagePath));
 
if($opts['scale'] === true)
{
    $imagick->scaleImage($w, $h);
}
elseif($opts['crop'] === true)
{
    $imagick->cropThumbnailImage($w, $h);
}
else
{
    $imagick->thumbnailImage($w, $h);
}
 
$imagick->writeImage(realpath($cacheFolder).'/'.str_replace($cacheFolder, '', $newPath));
// s2s end

Lascia un commento

Assicurati di inserire (*) le informazioni necessarie ove indicato. Il tuo avatar verrà preso da Gravatar.com.

Inserisci l'URL del tuo sito...

1 commento

  • Stefano Storti Stefano Storti 27/03/2013 12:16

    Aggiornato con capitolo "Hosting che non permettono comandi da exec()"

Google