Redimensionner une image lors d'un upload

morgan24 Messages postés 220 Date d'inscription   Statut Membre Dernière intervention   -  
Mr.White Messages postés 251 Date d'inscription   Statut Membre Dernière intervention   -
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 380 Date d'inscription   Statut Membre Dernière intervention   40
 
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 220 Date d'inscription   Statut Membre Dernière intervention   25
 
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   Statut Membre Dernière intervention   1 > morgan24 Messages postés 220 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   1
 
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   Statut Contributeur Dernière intervention   136
 
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   Statut Contributeur Dernière intervention   136
 
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 380 Date d'inscription   Statut Membre Dernière intervention   40
 
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 220 Date d'inscription   Statut Membre Dernière intervention   25
 
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 220 Date d'inscription   Statut Membre Dernière intervention   25
 
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 380 Date d'inscription   Statut Membre Dernière intervention   40
 
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   Statut Membre Dernière intervention   1
 
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
MoKaLux
 
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   Statut Membre Dernière intervention   53
 
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