Ridimensionare le immagini in PHP, script per creare thumbnail

Questo script in PHP vi permette di fare l’upload di un immagine e di creare il rispettivo thumbnail con dimensioni proporzionali a quelle originali (basta scegliere la larghezza).

Lo script è abbastanza modificabile e la funzione di generazione dell’immagine ridimensionata è estraibile (e quindi utilizzabile nei vostri scripts).

Un ringraziamento va a A35G per la correzione dello script!

Ecco il codice (fate copia-incolla sul vostro notepad):

<?
# MODIFICARE le 4 variabili qui sotto con le impostazioni del vostro server e il nome del file (31 righe più giù) all’interno del form html

#ATTENZIONE: per funzionare lo script avrà bisogno che le cartelle qui sotto siano accessibili il scrittura, settate gli opportuni permessi

$imgpathbig = "/path/dove/appoggiare/immagine/grande/"; # path assoluto dove lo script appoggerà l’immagine che inviate

$imgurlbig = "http://indirizzo.com/cartella/immagine/grande/"; # url dell’immagine grande, se volete che questa venga visualizzata

$imgpathsmall = "/path/dove/appoggiare/immagine/grande/"; # path assoluto dove lo script creerà l’immagine ridimensionata

$imgurlsmall = "http://indirizzo.com/cartella/immagine/ridimensionata/"; # url dell’immagine piccola

/*
COMPATIBILITA’
$_FILES in 4.1.0, prima $HTTP_POST_FILES
is_uploaded_file, move_uploaded_file, in 4.0.3
rand, senza chiamata a srand in 4.2.0. Se inferiore aggiungere srand((double) microtime() * 1000000);
imagecreatetruecolor in 4.0.6
*/

#questo è un form essenziale per inviare allo script le immagini.
if($_POST["submit"] != "Ridimensiona&quot ;) {
?>
<html>
<head>

<style>
body{font-family:verdana;font-size:12px}
table{font-family:verdana;font-size:12px}
h1{font-family:verdana;font-size:20px;font-weight:bold}
</style>
<title>Ridimensiona immagine</title>
</head>
<body>
<center>
<h1>Ridimensiona immagine</h1>

<!– MODIFICARE nome-script.php con il nome del file che avete creato –>
<form action="nome-script.php" method="post" enctype="multipart/form-data">
<table border="1" cellpadding="10">

<tr>
<td><b>Immagine: (jpg o png)</b></td>
<td align="right"><input type="file" name="img" size="20"></td>

</tr>
<tr>
<td><b>Larghezza: (in pixel)</b></td>
<td align="center"><input type="text" name="width" size="5" value="150"></td>

</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="submit" value="Ridimensiona"></td>

</tr>
</table>
</form>
<p><i>Script realizzato da</i> <a href="http://fdalesio.wordpress.com/">Francesco D’Alesio</a></p>

</body>
</html>
<?

} else {
#Salve, sono lo script, io comincio da qui e vi spiego cosa faccio…

#Assegno alla variabile width il valore scritto nel form e controllo che sia un numero
$width = $_POST[width];
if(!is_numeric($width)) { print("<center><b>La larghezza deve essere un numero intero"); exit; }

#Controllo se il file è stato inviato; controllo se il file è un immagine jpg o png e assegno alla variabile ext l’estensione giusta
if (!is_uploaded_file($_FILES["img"]["tmp_name"])) { print("<center><b>Errore nell’upload del file"); exit; }
if($_FILES["img"]["type"] == "image/jpeg" || $_FILES["img"]["type"] == "image/pjpeg&quot ;) { $ext = "jpg";
} elseif($_FILES["img"]["type"] == "image/png&quot ;) { $ext = "png";
} else { print("<center><b>L’immagine pu&ograve; essere solo jpeg o png"); exit; }

#Genero un nome per il file inviato casualmente, questo perchè se lo script viene utilizzato da più persone c’è il rischio che si operi sugli stessi files contemporaneamente.
#Se lo utilizzate per "uso personale" potete anche saltare. Mettete il commento (#) davanti alla riga qui sotto e toglietelo da quella successiva.
$nomefile = rand(1, 100);
#$nomefile = $_FILES["img"]["name"];

#Definisco il path delle due immagini
$filebig = $imgpathbig . $nomefile . "." . $ext;
$filesmall = $imgpathsmall . "TN" . $nomefile . "." . $ext;

#Sposto il file inviato dal form nella directory scelta e con il nome definito sopra
move_uploaded_file($_FILES["img"]["tmp_name"], $filebig) or die("<center>Errore durante l’upload del file");

#Genero l’immagine ridimensionata
function makethumb($name, $thname, $width) {
#Vedo se il file è jpg o png e creo un immagine di conseguenza
$data = GetImageSize($name);
switch ($data[2]) {
case 1: #copy($name,$thname);
return;
break;
case 2:
$im = @imagecreatefromjpeg($name);
break;
case 3:
$im = @imagecreatefrompng($name);
break;

}
#Assegno alle variabili w e h rispettivamente la larghezza e l’altezza dell’immagine originale
$w=ImageSX($im);
$h=ImageSY($im);
#Creo un divisore per mantenere le proporzioni dell’immagine
$div = $w / $width;
#Calcolo l’altezza dell’immagine ridimensionata
$nh = $h / $div;
#Creo l’immagine ridimensionata
$ni=ImageCreatetruecolor($width,$nh);
ImageCopyResized($ni,$im,0,0,0,0,$width,$nh,$w,$h);
if($data[2] == 2) ImageJPEG($ni,$thname,100);
if($data[2] == 3) ImagePNG($ni,$thname,100);
}

#Richiamo la funzione
makethumb($filebig, $filesmall, $width);
#Cancello l’immagine grande, se volete mantenerla nella cartella che avete specificato sopra mettete un commento (#) davanti a questa riga
#unlink($filebig);
#Mostro l’immagine ridimensionata
?>

<html><head><title>Immagine ridimensionata</title>
<center>
Immagine piccola<br>
<img src="<?= $imgurlsmall ?>TN<?= $nomefile ?>.<?= $ext ?>" alt="Immagine ridimensionata">

<?
#Se volete, sotto l’immagine ridimensionata, posso farvi vedere anche l’immagine grande (se avete impostato in cima al file la variabile imgurlbig). Per farla visualizzare dovete togliere il commento dalla riga sotto e mettere il commento davanti a unlink($filebig), 8 righe sopra
print("<br><br>Immagine grande<br><img src=’$imgurlbig$nomefile.$ext’ alt=’Immagine grande’>");
}
?>

Se trovate dei bug o avete problemi per farlo funzionare commentate pure..

19 Risposte a “Ridimensionare le immagini in PHP, script per creare thumbnail”

  1. mk Dice:

    ciao!
    Sto provando il tuo script per fare l’upload delle immagini, ma non riesce a capire formato dell’immagine…ti spedisco il pezzo di codice!
    se puoi darmi una mano mi saresti di grande aiuto! :P
    Mk

    if (!is_uploaded_file($_FILES["img"]["tmp_name"])) {
    echo “Errore nell’upload del file”;
    }

    if($_FILES['miofile']['tmp_name'] == “image/jpeg” ;) {
    $ext = “jpg”;
    }elseif($_FILES['miofile']['tmp_name'] == “image/png” ;) {
    $ext = “png”;
    }else {
    echo”
    L’immagine può essere solo jpeg o png”;
    $immagine_consentita = false;
    }

    // ESEGUO L’UPLOAD CONTROLLANDO L’ESITO
    if ($immagine_consentita){
    if (move_uploaded_file($percorso, $cartella . $nome))
    {
    $path = $cartella . $nome;
    print “Upload eseguito con successo”;
    $width = 200;
    $esito = makethumb($path, $path, $width);
    if($esito){
    // inserisco nel db

  2. mk Dice:

    mi sono accorto di un errore, ma non funziona lo stesso!!!
    cmq il codice senza quell’ errore, ma non funzionante è questo

    if (!is_uploaded_file($_FILES['miofile']['tmp_name'])) {
    echo “Errore nell’upload del file”;
    }

    if($_FILES['miofile']['tmp_name'] == “image/jpeg” ;) {
    $ext = “jpg”;
    }elseif($_FILES['miofile']['tmp_name'] == “image/png” ;) {
    $ext = “png”;
    }else {
    echo”
    L’immagine può essere solo jpeg o png”;
    $immagine_consentita = false;
    }

    // ESEGUO L’UPLOAD CONTROLLANDO L’ESITO
    if ($immagine_consentita){
    if (move_uploaded_file($percorso, $cartella . $nome))
    {
    $path = $cartella . $nome;
    print “Upload eseguito con successo”;
    $width = 200;
    $esito = makethumb($path, $path, $width);
    if($esito){
    // insert nel db

  3. fdalesio Dice:

    ciao,
    ti ho scritto anche via email, forse non l’hai vista!
    comunque, vedo subito che hai $_FILES['miofile']['tmp_name] == “image/png”

    dentro quella variabile c’è il nome che viene assegnato temporaneamente al file uploadato. forse tu cercavi $_FILE['miofile']['type'], dove c’è scritto il tipo di file!
    vedi un pò sennò fammi sapere

  4. A35G Dice:

    Ciao,
    inizialmente voglio congratularmi per gli ottimi script che sviluppi :)
    poi vorrei richiederti delle informazioni riguardo questo warning:

    [code]Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of getimagesize(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in ./../../../../../../../miapagina.php[/code]

    Questo Warning, come puoi vedere, si riferisce a :

    [code]#Genero l’immagine ridimensionata
    function makethumb($name, $thname, $width) {
    #Vedo se il file è jpg o png e creo un immagine di conseguenza
    $data = GetImageSize($name,&$info);

    [CUT..][/code]

    ora…lo script funziona lo stesso anche con il Warning e per quest’ultimo sto cercando di risolvere con gli .htaccess per neascondere gli errori ma…se non sarà più supportata…un metodo migliore o un metodo per scavalcare il problema?

  5. fdalesio Dice:

    Ciao,
    grazie per i complimenti :)

    allora per nascondere il warning puoi provare a fare così
    $data = @GetImageSize($name, &$info);

    invece, per eliminare proprio il problema, prova a sostituire quella riga con
    $data = GetImageSize($name);

    fammi sapere così in caso modifico lo script

    Grazie

    Ciao

  6. A35G Dice:

    Ti ringrazio per l’aiuto, la tempestività e la disponibilità :)

    Allora:

    aggiungendo la @ non succede nulla mentre eliminando &$info, il Warning sparisce e lo script continua a funzionare continuamente.

    Grazie per il tuo aiuto :)

    Ciao

  7. fdalesio Dice:

    Ottimo,
    modifico lo script allora

    Grazie a te!

    ciao

  8. A35G Dice:

    Ciao ritorno di nuovo qui per chiederti un altro aiuto…lo script, correttamente funzionante fino alla giornata di ieri, oggi ha iniziato a dare problemi con la gestione delle thumb di immagini PNG. Le crea ma di 0 byte e dando il seguente errore:

    [code]Fatal error: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib[/code]

    La riga dell’errore è la seguente:

    [code] if($data[2] == 3) ImagePNG($ni,$thname,100);[/code]

    Ho googlato un pò e ho potuto constatare che in molti hanno lo stesso problema con PHP v5.1.x e superiori. Su un sito tedesco, consigliano una modifica al codice per evitare questo problema…modifica che poi non è tanto diversa come è strutturato il tuo script:

    http://www.4homepages.de/forum/index.php?topic=11806.new

    Tu cosa mi consigli?

    Grazie per la disponibilità

    Ciao

  9. A35G Dice:

    Ok risolto :)

    Basta inserire al posto di:

    if($data[2] == 3) ImagePNG($ni,$thname,100);

    questo:

    if($data[2] == 3) ImagePNG($ni,$thname,$quality = 9);

  10. fdalesio Dice:

    Grazie per aver postato la soluzione :)

  11. A35G Dice:

    Altro problemino riscontrato:

    if($_FILES["img1"]["type"] == “image/jpeg” ;) {
    $ext = “jpg”;
    } elseif($_FILES["img1"]["type"] == “image/png” ;) {
    $ext = “png”;
    } else {
    print(”L’immagine può essere solo jpeg o png”);
    exit;
    }

    IE, anche se è una jpg continua a stamparmi l’errore…lo splendido Firefox va a meraviglia…

  12. A35G Dice:

    Risolto anche questo problema

    //Hack For IE

    if(($_FILES["img1"]["type"] == “image/jpeg” ;) || ($_FILES["img1"]["type"] == “image/pjpeg”)) {

  13. fdalesio Dice:

    modifico il codice, ti ho inserito un ringraziameto, vuoi che lo linki?

  14. A35G Dice:

    Come vuoi e ti ringrazio :)

    Io naturalmente sono un pò all’antica cioè…se posso aiutare aiuto, se posso collaborare e contribuire ne son felice…ti ho postato le modifiche perchè uso il tuo script e perchè possono essere utili anche agli altri…

    Il rispetto per il lavoro altrui prima di tutto :)

  15. fdalesio Dice:

    Menomale che esistono ancora le persone all’antica ;)

    Grazie a te per l’ottimo contributo!

    ciao

  16. A35G Dice:

    Ciao, ho aggiunto lo script modificato nel mio forum e inserito il link alla tua pagina ;)

  17. fdalesio Dice:

    Grazie A35G!

    mi fa molto piacere

  18. michele Dice:

    ciao, non nso se ti ricordi, ti avevo chiesto delucidazioni in merito al tuo codice, un po’ di tempo fa!
    ti volevo dire che si parla di te su newsgroup:
    http://groups.google.it/group/it.comp.www.php/browse_thread/thread/1b97c3ce539a0c59/6c6d3a924c9f4db6?hl=it#6c6d3a924c9f4db6
    grazie
    Mk

  19. fdalesio Dice:

    Grazie della segnalazione Michele,

    mi fa molto piacere che lo script sia utile!

    Francesco

Lascia una Risposta