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"
{
?>
<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"
{ $ext = "jpg";
} elseif($_FILES["img"]["type"] == "image/png"
{ $ext = "png";
} else { print("<center><b>L’immagine può 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..
Aprile 10, 2007 alle 2:18 pm
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!
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
Aprile 10, 2007 alle 2:36 pm
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
Aprile 10, 2007 alle 2:53 pm
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
Maggio 17, 2007 alle 10:03 am
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?
Maggio 17, 2007 alle 10:14 am
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
Maggio 17, 2007 alle 10:49 am
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
Maggio 17, 2007 alle 11:02 am
Ottimo,
modifico lo script allora
Grazie a te!
ciao
Maggio 28, 2007 alle 10:18 am
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
Maggio 28, 2007 alle 10:28 am
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);
Maggio 28, 2007 alle 12:09 pm
Grazie per aver postato la soluzione
Maggio 30, 2007 alle 9:26 am
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…
Maggio 30, 2007 alle 10:31 am
Risolto anche questo problema
//Hack For IE
if(($_FILES["img1"]["type"] == “image/jpeg”
|| ($_FILES["img1"]["type"] == “image/pjpeg”)) {
Maggio 30, 2007 alle 11:07 am
modifico il codice, ti ho inserito un ringraziameto, vuoi che lo linki?
Giugno 1, 2007 alle 10:55 am
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
Giugno 1, 2007 alle 11:13 am
Menomale che esistono ancora le persone all’antica
Grazie a te per l’ottimo contributo!
ciao
Giugno 13, 2007 alle 10:48 am
Ciao, ho aggiunto lo script modificato nel mio forum e inserito il link alla tua pagina
Giugno 13, 2007 alle 12:55 pm
Grazie A35G!
mi fa molto piacere
Luglio 16, 2007 alle 11:29 am
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
Luglio 16, 2007 alle 1:17 pm
Grazie della segnalazione Michele,
mi fa molto piacere che lo script sia utile!
Francesco