Oggi vi presento una classe PHP per manipolare in tutta facilità le immagini: si tratta di SmartImage del buon Alessandro Coscia di CodiceFacile. Con poche righe di codice potremo ridimensionare, croppare, convertire, ottimizzare, ruotare le immagini ed aggiungervi un watermark. Il tutto compatibile sia con PHP 4 che 5.
Per prima cosa, scarichiamo SmartImage, quindi includiamo la classe nella pagina che dovrà usarla:
1 | include "SmartImage/SmartImage.class.php"; |
Ora vediamo come eseguire tutte le varie manipolazioni.
Ridimensionare un’immagine mantenendo le proporzioni:
2 3 4 | $img = new SmartImage("path/immagine.jpg"); $img->resize(100, 90); $img->saveImage("path/nuova-immagine.jpg"); |
Ridimensionare un’immagine tagliandola alle dimensioni esatte:
5 6 7 | $img = new SmartImage("path/immagine.jpg"); $img->resize(50, 50, true); $img->saveImage("path/nuova-immagine.jpg"); |
Convertire una immagine da un formato ad un altro:
8 9 | $img = new SmartImage("path/immagine.png"); $img->saveImage("path/nuova-immagine.gif"); |
Ottimizzare la risoluzione di una immagine jpg al 76%:
10 11 | $img = new SmartImage("path/immagine.jpg"); $img->saveImage("path/nuova-immagine.jpg", 76); |
Ruotare una immagine di 90 gradi:
12 13 14 | $img = new SmartImage("path/immagine.jpg"); $img->rotate(90); $img->saveImage("path/nuova-immagine.jpg"); |
Aggiungere un watermark (una immagine di filigrana):
12 13 14 | $img = new SmartImage("path/immagine.jpg"); $img->addWaterMarkImage("path/watermark.gif"); $img->saveImage("path/nuova-immagine.jpg"); |
Ovviamente potete utilizzare tutti i metodi in modo consecutivo, creando l’oggetto SmartImage solo una volta e salvando l’immagine alla fine.
Un’utile applicazione che ho scoperto consiste nell’utilizzare questa classe insieme alle funzioni di upload di PHP. Mettiamo che ho un form per l’upload di una immagine e voglio salvare l’immagine in formato big e in formato thumb. Ecco il codice dopo il POST del form:
1 2 3 4 5 6 7 8 9 10 11 12 | $file = $_FILES["foto"]; if($file["name"] != ""){ if($file["error"] == 0){ $img = new SmartImage($file["tmp_name"]); $img->resize(154, 338); $img->saveImage("path/foto.jpg"); $img->resize(60, 60, true); $img->saveImage("path/thumb.jpg"); }else{ echo "Errore"; } } |
Niente male, vero? Una classe completa per la creazione di thumbnail e molto di più. Sicuramente vi tornerà molto utile!




Non supporta la trasparenza…
ho aggiunto una funzione e commentato due istanze…e funziona.
Vi posto il codice:
#$new = imagecreatetruecolor($newwidth, $newheight);
$new = $this->saveTransparence($newwidth, $newheight);
#$new = imagecreatetruecolor($w, $h);
$new = $this->saveTransparence($w, $h);
private function saveTransparence($width, $height) {
$image_resized = imagecreatetruecolor($width, $height);
$image = $this->gdID;
if ($this->info[2] == 1 || $this->info[2] == 3) {
$trnprt_indx = imagecolortransparent($image);
// If we have a specific transparent color
if ($trnprt_indx >= 0) {
// Get the original image’s transparent color’s RGB values
$trnprt_color = imagecolorsforindex($image, $trnprt_indx);
// Allocate the same color in the new image resource
$trnprt_indx = imagecolorallocate($image_resized, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
// Completely fill the background of the new image with allocated color.
imagefill($image_resized, 0, 0, $trnprt_indx);
// Set the background color for new image to transparent
imagecolortransparent($image_resized, $trnprt_indx);
}
// Always make a transparent background color for PNGs that don’t have one allocated already
elseif ($this->info[2] == 3) {
// Turn off transparency blending (temporarily)
imagealphablending($image_resized, false);
// Create a new transparent color for image
$color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);
// Completely fill the background of the new image with allocated color.
imagefill($image_resized, 0, 0, $color);
// Restore transparency blending
imagesavealpha($image_resized, true);
}
}
return $image_resized;
}
0cool.f, scusami il codice che hai postato lo devrei inserirlo nella classe, ma in qualsiasi punto va bene??
si puo gestire la posizione del watermarks (alto|centro|basso – destra|centro|sinistra)??
grazie
Ciao, più che un commento vorrei lasciarvi un quesito:
E’ possibile modificare i dati exif di un immagine con php?
Salve a tutti. Ho un problema, io vorrei salvare un immagine acquisita nel form in questa cartella: users/prova/. Non mi da nessuno errore ma nn mi salva la foto
Il mio codice:
include “../../../include/SmartImage.php”;
$ConfAvatar = $_POST['ConfAvatar'];
$file = $_FILES["ConfAvatar"];
if($file["name"] != “”){
if($file["error"] == 0){
$img = new SmartImage($file["tmp_name"]);
$img->resize(64, 64, true);
$img->saveImage(“users/prova/avatar.png”);
}else{
echo “Errore hahahahahah”;
}
}
[Comment ID #919 Will Be Quoted Here]
Alla fine le soluzioni più semplici sono le migliori
Bravo e grazie per aver condiviso la soluzione anche per i posteri ^^
Ho risolto in modo “furbo”
1) metto in $temp il commento EXIF della foto
2) eseguo la rotazione come mi serve (l’oggetto scrive quel maledetto codice)
3) sovrascrivo il commento salvato in $temp
.. funziona.. ovviamente..
ciao e grazie comunque..!
.. allora per fare una prova.. si potrebbe usare tipo..
io ho provato ma mi stampa un codice incomprensibile..
[Comment ID #916 Will Be Quoted Here]
Ciao, temo che le librerie GD che la classe usa, modifichino l’EXIF automaticamente. Sinceramente non so se è possibile evitarlo, in rete non ho trovato nulla in proposito.
Ciao ho provato la classe .. funzione alla grande..!! Ho solo un problema:
Quando faccio ruotare l’immagine mi modifica i commenti nell’EXIF.. in pratica mi aggiunge un bel “CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 80″ sostituendo i commenti esistenti..!!
Come faccio a fare solo la rotazione senza modificare i parametri EXIF?
grazie
[Comment ID #584 Will Be Quoted Here]
Ciao.
1) Dunque, per salvare l’immagine mantenendo il suo nome originale, in riferimento al mio ultimo esempio, puoi scrivere:
$img->saveImage("path/" . $file["name"]);che andrà così a salvare l’immagine nella cartella “path” e con il nome che ha sul tuo disco fisso.
2) Per uploadare file multipli, puoi creare un form creando un array di campi:
<input type="file" name="foto[]" />
<input type="file" name="foto[]" />
<input type="file" name="foto[]" />
<input type="file" name="foto[]" />
per poi agire su di essi, richiamandoli da php:
foreach ($_FILES["foto"]["error"] as $key => $error) {
if($_FILES["foto"]["name"][$key] != ""){
if($error == 0){
$img = new SmartImage($_FILES["foto"]["tmp_name"][$key]);
// ecc..
}
}
}
Ciao,
complimentoni per il sito e l’ottimo lavoro svolto…
Ho guardato il tuo articolo…e l’ho trovato molto interessante in quanto sto svolgendo un progetto per l’università…tutto chiaro, ma ho riscontrato un piccolo problema…
1. come faccio a salvare l’immmagine con il suo nome originale e non con foto.jpg;
2. come posso utilizzare il codice per permettere all’utente di inserire 4 foto e far il controllo contemporaneo su tutte e 4?
Grazie!