BigThink

PHP: manipolare immagini con tre righe di codice

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!

Articolo scritto da Ghido

Fondatore di BigThink.it, si occupa dello sviluppo e del coordinamento dei progetti tecnologici. Specializzato nel Marketing su Facebook e nello sviluppo di Applicazioni Social, fa consulenza e formazione ad aziende ed agenzie.

Leggi anche...

Facebook Paginator: creare una paginazione in stile Facebook

Facebook Paginator: creare una paginazione in stile Facebook

Ti è capitato di sviluppare Applicazioni Facebook dove devi mostrare lunghe serie di dati? Magari hai la tabella con tutti gli utenti iscritti, ma non puoi mostrare 10.000 record tutti sulla stessa pagina! Ecco che allora tornerebbe utile un sistema di paginazione che divida i vari record su più pagine, facilmente navigabili. Perchè allora non ...
Dividere su due colonne le categorie di WordPress

Dividere su due colonne le categorie di WordPress

Con questo post inizia una nuova serie di guide per la creazione o personalizzazione dei template di WordPress, ambito in cui mi sono specializzato recentemente. Oggi vedremo come dividere l'elenco delle categorie del nostro blog, su due colonne di egual lunghezza. Può tornarci utile nel caso avessimo veramente tante categorie e, per una maggiore ...
Test Driven Development: prima i test, poi il codice

Test Driven Development: prima i test, poi il codice

Un metodo non tradizionale e agile per lo sviluppo e il design del software è il Test Driven Development (TDD): sviluppo guidato dai test. E' un'alternativa al solito metodo a cascata (waterfall), secondo il quale, dopo un'adeguata analisi e progettazione, si inizia a scrivere il codice e solo alla fine si passa al ...
Risorse per creare un'applicazione Facebook in PHP

Risorse per creare un’applicazione Facebook in PHP

Facebook è ormai un fenomeno di massa, perchè non approfittarne? Da bravi programmatori PHP quali siamo, ci sarà pur venuta la curiosità di creare una nostra applicazione Facebook, giusto per sperimentare qualcosa di nuovo o magari per promuovere il nostro sito o blog. E' giunto allora il momento di buttarci ed iniziare a studiare ...
Array delle nazioni del mondo e delle province italiane

Array delle nazioni del mondo e delle province italiane

Creando una qualsiasi applicazione web (ma anche desktop), può capitare molto spesso di aver bisogno di una lista delle nazioni del mondo, piuttosto che quella delle province italiane. Paradossalmente, risorse del genere sembrano quasi introvabili sul web o comunque richiedono lunghe ricerche. Qualcosa si trova, ma spesso non è nel formato che serve a ...

11 Commenti

  1. 0cool.f

    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;
    }

    24 novembre 2010, 14:30
    • 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

      12 aprile 2011, 16:46
  2. Gianfranco

    Ciao, più che un commento vorrei lasciarvi un quesito:
    E’ possibile modificare i dati exif di un immagine con php?

    13 dicembre 2009, 10:40
  3. 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”;
    }
    }

    17 novembre 2009, 20:48
  4. Ghido

    [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 ^^

    24 ottobre 2008, 23:33
  5. Donato

    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..!

    24 ottobre 2008, 20:38
  6. Donato

    .. allora per fare una prova.. si potrebbe usare tipo..

    io ho provato ma mi stampa un codice incomprensibile..

    24 ottobre 2008, 19:28
  7. Ghido

    [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.

    24 ottobre 2008, 19:22
  8. Donato

    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

    24 ottobre 2008, 18:50
  9. Ghido

    [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..
    }
    }
    }

    1 settembre 2008, 00:28
  10. Robertino

    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!

    21 agosto 2008, 11:14

3 Citazioni