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:
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.
// 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