Redimensionner une image lors d'un upload

Fermé
morgan24 Messages postés 211 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 31 août 2020 - 19 mai 2009 à 15:10
Mr.White Messages postés 251 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 17 juillet 2012 - 3 juil. 2012 à 12:52
Bonjour,

J'ai un petit site internet d'annonces avec photos, le problème est que lorsque un membre dépose une photo trop lourde, ça plante ...

Je suis à la recherche d'un script pour redimensionner automatiquement une image/photo lorsque le membre veut insérer une image dans son annonce

Merci pour votre aide
A voir également:

8 réponses

xxkirastarothxx Messages postés 378 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 22 mars 2013 40
19 mai 2009 à 16:04
Cadeau :)
Petit script perso de redimentionement d'image.
l'image garde son ratio d'aspect.

Je te conseil de faire des test:
-l'image est copié,
-l'image "image.png" est redimensionné en petit et en grand avec des tag "MINI_images.png" et "BIG_image.png"
-et peut etre d'autre fonction qui ne te serront pas forcement utilies.

utilisation:
<?php resize_clone("/ton/chemin/vers/ton/", "image.png");
n'oublie pas le "/" a la fin du chemin

Bonne chance :)

<?php
function resize_clone($path, $file)
{
	list($width, $height, $type, $attr) = getimagesize($path.$file);
	$ratio = $height / $width;
	if ($height > 500 OR $width > 500)
	{
		if($ratio <= 1)
		{
			$x = 500;
			$y = 500*$ratio;
		}
		else
		{
			$y = 500;
			$x = 500*(1/$ratio);
		}
	}
	else
	{
		if($ratio <= 1)
		{
			$x = $width;
			$y = $width*$ratio;
		}
		else
		{
			$y = $height;
			$x = $height*(1/$ratio);
		}
	}
	$size = getimagesize($path.$file);
	if ( $size)
	{
		if ($size['mime']=='image/jpeg' )
		{
			$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagejpeg($img_mini,$path."big_".$file );
		}
		elseif ($size['mime']=='image/png' )
		{
			$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagepng($img_mini,$path."big_".$file );
		}
		elseif ($size['mime']=='image/gif' )
		{
			$img_big = imagecreatefromgif($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagegif($img_mini,$path."big_".$file );
		}
	}
	if($ratio <= 1)
	{
		$x = 90;
		$y = 90*$ratio;
	}
	else
	{
		$y = 90;
		$x = 90*(1/$ratio);
	}
	$size = getimagesize($path.$file);
	if ( $size)
	{
		if ($size['mime']=='image/jpeg' )
		{
			$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagejpeg($img_mini,$path."mini_".$file );
		}
		elseif ($size['mime']=='image/png' )
		{
			$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
			$img_new = imagecreate($x, $y);
			# création de la miniature
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			// copie de l'image, avec le redimensionnement.
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagepng($img_mini,$path."mini_".$file );
		}
		elseif ($size['mime']=='image/gif' )
		{
			$img_big = imagecreatefromgif($path.$file);
			$img_new = imagecreate($x, $y);
			$img_mini = imagecreatetruecolor($x, $y)
			or   $img_mini = imagecreate($x, $y);
			imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
			imagegif($img_mini,$path."mini_".$file );
		}
	}
	unlink($path.$file);
}
?>
2
morgan24 Messages postés 211 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 31 août 2020 25
19 mai 2009 à 16:31
Merci pour ton info, mais ça ne fonctionne pas

je viens d'essayer comme ceci :

<?php resize_clone("jackson/", "test.png"); ?>
<?php
function resize_clone($path, $file)
{
list($width, $height, $type, $attr) = getimagesize($path.$file);
$ratio = $height / $width;
if ($height > 500 OR $width > 500)
{
if($ratio <= 1)
{
$x = 500;
$y = 500*$ratio;
}
else
{
$y = 500;
$x = 500*(1/$ratio);
}
}
else
{
if($ratio <= 1)
{
$x = $width;
$y = $width*$ratio;
}
else
{
$y = $height;
$x = $height*(1/$ratio);
}
}
$size = getimagesize($path.$file);
if ( $size)
{
if ($size['mime']=='image/jpeg' )
{
$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagejpeg($img_mini,$path."big_".$file );
}
elseif ($size['mime']=='image/png' )
{
$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagepng($img_mini,$path."big_".$file );
}
elseif ($size['mime']=='image/gif' )
{
$img_big = imagecreatefromgif($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagegif($img_mini,$path."big_".$file );
}
}
if($ratio <= 1)
{
$x = 90;
$y = 90*$ratio;
}
else
{
$y = 90;
$x = 90*(1/$ratio);
}
$size = getimagesize($path.$file);
if ( $size)
{
if ($size['mime']=='image/jpeg' )
{
$img_big = imagecreatefromjpeg($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagejpeg($img_mini,$path."mini_".$file );
}
elseif ($size['mime']=='image/png' )
{
$img_big = imagecreatefrompng($path.$file); # On ouvre l'image d'origine
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagepng($img_mini,$path."mini_".$file );
}
elseif ($size['mime']=='image/gif' )
{
$img_big = imagecreatefromgif($path.$file);
$img_new = imagecreate($x, $y);
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagegif($img_mini,$path."mini_".$file );
}
}
unlink($path.$file);
}
?>

et ça me dit :

Warning: unlink(jacksoni/test.png) [function.unlink]: Permission denied in d:\www\jacksonman.fr\htdocs\fototest.php on line 116
0
jean.miche Messages postés 90 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 30 mai 2014 1 > morgan24 Messages postés 211 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 31 août 2020
9 févr. 2010 à 21:44
bonjour,

peux-tu me dire comment tu as utilisé cette fonction s'il te plaît ?
Car je n'arrive pas à l'appliquer...
Notamment cette partie :
<?php resize_clone("jackson/", "test.png"); ?> 

Merci :)
0
jean.miche Messages postés 90 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 30 mai 2014 1
4 févr. 2010 à 19:16
Bonjour et merci pour ce script,

j'ai cependant des questions :
où places-tu la première ligne ?
<?php resize_clone("/ton/chemin/vers/ton/", "image.png"); ?>


dois-je remplacer "/ton/chemin/vers/ton/", "image.png" par le dossier vers lequel j'upload mes images ?
c'est à dire "mon_site/dossier_upload/", ce qui supprime la ","


Enfin, il semble y avoir un problème avec le getimagesize puisque lorsque j'ouvre ma page, j'ai :
Warning: Missing argument 2 for resize_clone() in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: Division by zero in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: unlink(../photos/) [function.unlink]: Is a directory in /home/www/...


Merci d'avance. =)
0
rescue Messages postés 1039 Date d'inscription vendredi 16 novembre 2007 Statut Contributeur Dernière intervention 27 mars 2019 136
19 mai 2009 à 15:54
Bonjour,

Je ne vois pas a quoi cela pourrait servir... (Pourquoi programmer alors que l'on peux informer)

Il suffit de mettre un message au niveau du formulaire :
Attention ce serveur n'accepte pas des fichiers dont la taille est supérieur à 500ko (par exemple)

Dans votre formulaire qui upload placer ce code :
<input type="hidden" name="MAX_FILE_SIZE" value="500000" />
Vous bloquez ainsi les photos qui sont au dessus de ce poids.
(500000 octets environs 500Ko).

Cordialement
1
rescue Messages postés 1039 Date d'inscription vendredi 16 novembre 2007 Statut Contributeur Dernière intervention 27 mars 2019 136
20 mai 2009 à 11:42
Bonjour,

Je vois que vous avez opté pour le upload avec réduction de l'image en temps réel.
C'est votre choix j'espère que vous avez fait le bon.

Pour augmenter la durée d'un script sur un serveur web il faut modifier la directive max_execution_time du php.ini comme cela n'est pas possible puisque le fichier est chez votre hébergeur alors voici une solution à condition que la directive desable_functions ne soit pas alimenté.

Vous placer cette fonction php dans votre scritp upload : set_time_limit(0);

J'oubliai, il faut aussi que la directive upload_max_filesize soit au dessus de 2Mo

Astuce : placer un fichier php.ini à la racine de votre serveur web avec à l'intérieur

max_execution_time = 180
upload_max_filesize = 10


Cordialement
1
xxkirastarothxx Messages postés 378 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 22 mars 2013 40
19 mai 2009 à 17:05
Permission denied ==> tu n'as pas les droits sur l'image pour la supprimé.
plusieurs possibilité, de la plus propre à la plus burine:

1] si tu as un access ftp, ssh ou même local au serveur, tente un chmod 777 sur ton image
2] sinon essaye de faire un chmod 777 de ton image via php
3] met un @ devant la commande unlink de la fonction
4] supprime la commande unlink de la fonction
0
morgan24 Messages postés 211 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 31 août 2020 25
20 mai 2009 à 11:13
Bonjour,

Merci beaucoup pour ton aide car ça fonctionne. Il reste qd même un problème..., lorsque le membre upload une photo lourde (style 3 MO) sur mon site, ça ram beaucoup, voir ça plante. Est ce possible de réduire automatiquement la photo juste avant l'upload ? Tout en sachant que le membre ne va pas du tout savoir réduire lui même la photo et ne va pas vouloir s'embêter avec ça.
Il y a un site de vente aux enchères"très connu :-)", ou tu peux insérer des photos ultra lourdes sans attendre 20 ans et sans plantage; comment font ils !?

Merci encore pour votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
morgan24 Messages postés 211 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 31 août 2020 25
25 mai 2009 à 10:56
Bonjour,

Tout d'abord merci beaucoup pour vos infos précieuses, tout fonctionne à merveille, le bonheur total ....

Un dernier petit problème, la qualité de la petite photo n'est pas du tout net, elle fait +/- 3 ko. Comment puis je faire pour qu'elle soit beaucoup plus net (exemple : "dans le site de vente aux enchères" les petites photos de 3 ko sont très net) !

Merci
0
xxkirastarothxx Messages postés 378 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 22 mars 2013 40
17 juin 2009 à 10:37
Alors, j'ai une petite astice, mais je ne sais pas ce que ça pourra donner.
Si je dis pas de bétise ça à marché pour moi:

dans mon script, remplace tout les "imagecreate" par "imagecreatetruecolor", sauf pour les lignes ou il y a:
$img_mini = imagecreatetruecolor($x, $y) or   $img_mini = imagecreate($x, $y);
dans ce cas il te suffis de supprimer "or $img_mini = imagecreate($x, $y)"

Autre chose:

Je vois que vous avez opté pour le upload avec réduction de l'image en temps réel.
C'est votre choix j'espère que vous avez fait le bon.

Ceci m'intéresse:
Que conseillerai tu d'autre que cet astuce ?
Un système qui, par exemple, upload l'image, mais ne la redimensionnerai que, par exemple, aux heurs de creux, ou un script qui "scan" l'activiter de processeur quelques chose comme ça ?
Enfin si tu as d'autre conseil je suis preneur par-ce que c'est vrai que sur un site très visité ça pourrait posé problème.

Merci :)
0
jean.miche Messages postés 90 Date d'inscription samedi 22 août 2009 Statut Membre Dernière intervention 30 mai 2014 1
4 févr. 2010 à 19:18
Bonjour et merci pour ce script,

j'ai cependant des questions :
où places-tu la première ligne ?
<?php resize_clone("/ton/chemin/vers/ton/", "image.png"); ?>


dois-je remplacer "/ton/chemin/vers/ton/", "image.png" par le dossier vers lequel j'upload mes images ?
c'est à dire "mon_site/dossier_upload/", ce qui supprime la ","


Enfin, il semble y avoir un problème avec le getimagesize puisque lorsque j'ouvre ma page, j'ai :
Warning: Missing argument 2 for resize_clone() in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: Division by zero in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: getimagesize() [function.getimagesize]: Read error! in /home/www/...

Warning: unlink(../photos/) [function.unlink]: Is a directory in /home/www/...


Merci d'avance. =)
0
Merci beaucoup pour la fonction, cela marche très bien.
Pour jean.miche tu place
<?php resize_clone("/ton/chemin/vers/ton/", "image.png"); ?>
où tu veux, ta page web ou dans ton code même.

Et en ce qui concerne la virgule, non ne la supprime pas car cela sert à envoyer deux données à la fonction resize_clone(01tonchemin, 02tonfichier).
0
Mr.White Messages postés 251 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 17 juillet 2012 53
3 juil. 2012 à 12:52
Bonjour,

Je cherche également à ce que l'utilisateur n'ai pas a se soucié du poids de son image et donc à ce que le redimensionnement se fasse automatiquement. D'après ce que je lit ici j'ai l'impression que c'est le cas mais ce n'est pas dit explicitement. J'aimerai donc que vous me confirmer que c'est bien possible avec ce script avant que je me lance dans son intégration à ma page.

Ou si vous me dirigé vers un autre script qui réalise ce que je cherche, ça m'irra tout aussi bien ;o)

Merci.
0