Upload et redimention image

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Upload et redimention image

Re: Upload et redimention image

par Invité » 13 déc. 2006, 15:40

Salut,

après de nombreuses recherche sur le net (dont ce forum) je n'ai pas trouvé réponse à mon problème.
Voici de quoi il sagit : on entre un produit via la page d'ajout. On peut ensuite ajouter une image à ce produit en cliquant sur un lien. L'image est recadrée en 700 de large OU 500 de haut et renommée REFERENCE.jpg, cette image est retravaillée et recadrée en 80 de large OU 80 de haut et renommée REFERENCE_mini.jpg (en gros il fait une vignette)
Le problème est le suivant : il crée bien les images mais je veux que si l'image est plus petites que les normes définies (700x500 dans mon script) qu'elle ne soit pas touchée d'un poil et envoyée tel quel
De même comment peut on gérer la compression ? car une image peut entrer dans les normes définies mais faire 150ko ... il faudrait pouvoir réduire ça.
Voici mon code :

Code : Tout sélectionner

<? switch ($page){ default : echo "<center>Choisir l'image à envoyer :<br> <form method='post' action='?page=suite&nomimage=".$nomimage."' enctype='multipart/form-data'> <input type='hidden' name='MAX_FILE_SIZE' value=''> <input type='file' name='fichier1' size='120'><br> <input type='submit' value='Envoyer'> </form><br><br> Attention en cas de gros fichiers envoyés le traitement peut prendre plusieurs minutes !<br> Pour accélérer ce temps, réduisez la taille de vos prises de vues (réglage sur l'appareil),<br> ou réduisez celle ci sur l'ordinateur.</center>"; break; case "suite": function thumbnail($file, $name, $ext, $maxWidth, $maxHeight){//Créer une image à partir de $file $img = ImageCreateFromJpeg("$file"); //Dimensions de l'image $imgWidth = imagesx($img); $imgHeight = imagesy($img); if ($ext!="big"){ $extens= "_mini.jpg"; } else{ $extens=".jpg"; } //Fixe les dimensions du thumb en testant si l'image n'est pas plus petite que les dimensions imposées if($ext=="big" AND ($imgWidth>$maxWidth OR $imgHeight>$maxHeight)){ $repertoire = "/home/lefuretr/www//produits/"; move_uploaded_file($_FILES['fichier1']['tmp_name'], $repertoire.$name.$extens); } else{ //Facteur largeur/hauteur des dimensions max $whFact = $maxWidth/$maxHeight; //Facteur largeur/hauteur de l'original $imgWhFact = $imgWidth/$imgHeight; if($whFact < $imgWhFact){//Si largeur déterminante $thumbWidth = $maxWidth; $thumbHeight = $thumbWidth/$imgWhFact; } else { //Si hauteur déterminante $thumbHeight = $maxHeight; $thumbWidth = $thumbHeight*$imgWhFact; } //Crée le thumb (image réduite) $imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight); //Insère l'image de base redimensionnée ImageCopyResized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight); //Nom du fichier thumb $imgThumbName = "/home/lefuretr/www/casacollector/produits/".$name.$extens; } //Crée le fichier thumb $fp = fopen($imgThumbName, "w"); fclose($fp); //Renvoie le thumb créé ImageJpeg($imgThumb, $imgThumbName); return $imgThumbName; } thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"big",700,500); thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"vign",80,80); echo "<center><br><br>L'image a été envoyée avec succès<br><br><a href='produits_ajout.php' target='b'>Retour</a>"; break; } ?>
MERCI d'avance

par lacfab » 21 oct. 2006, 16:50

Bon puisqu'on ne peut compte que sur soi sur ce forum depuis quelque temps j'ai fini par trouver ... ça m'a pris deux jours mais bon ...

Code : Tout sélectionner

switch ($page){ default : echo "<center>Choisir l'image à envoyer :<br> <form method='post' action='?page=suite&nomimage=".$nomimage."' enctype='multipart/form-data'> <input type='hidden' name='MAX_FILE_SIZE' value=''> <input type='file' name='fichier1' size='120'><br> <input type='submit' value='Envoyer'> </form><br><br> Attention en cas de gros fichiers envoyés le traitement peut prendre plusieurs minutes !<br> Pour accélérer ce temps, réduisez la taille de vos prises de vues (réglage sur l'appareil),<br> ou réduisez celle ci sur l'ordinateur.</center>"; break; case "suite": function thumbnail($destImage, $name, $genre, $newWidth, $newHeight){ // détéction du type de l'image eregi("(...)$",$image,$regs); $type = $regs[1]; $srcImage = @imagecreatefromjpeg( $destImage ); if($srcImage){ // hauteurs/largeurs $srcWidth = imagesx( $srcImage ); $srcHeight = imagesy( $srcImage ); $ratioWidth = $srcWidth/$newWidth; $ratioHeight = $srcHeight/$newHeight; // taille maximale dépassée ? if (($ratioWidth > 1) || ($ratioHeight > 1)) { if( $ratioWidth < $ratioHeight){ $destWidth = $srcWidth/$ratioHeight; $destHeight = $newHeight; } else{ $destWidth = $newWidth; $destHeight = $srcHeight/$ratioWidth; } } else { $destWidth = $srcWidth; $destHeight = $srcHeight; } // resize $destImage = ImageCreateTruecolor( $destWidth, $destHeight); imagecopyresized( $destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight ); // nom du fichier if ($genre =="vign"){ $ext = "_mini"; } $repertoire = "/home/lefuretr/www/casacollector/produits/"; $destFile = $repertoire.$name.$ext.".jpg"; // création et sauvegarde de l'image finale /* Ici on peut éditer le chemin de sauvegarde ($dest_file) */ imageJpeg($destImage, $destFile); // libère la mémoire imagedestroy( $srcImage ); imagedestroy( $destImage ); return $destFile; } else{ echo "ERREUR"; } } // Execution de la fonction // RatioResizeImg("chemin", largeur, hauteur) echo "<center><br><br>Agrandissement traité <br>"; thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"big",700,500); echo "<br>Vignette traitée <br>"; thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"vign",80,80); echo "<br><br><a href='produits_ajout.php' target='b'>Retour</a>"; break; }
Voilà si ça peut servir à quelqu'un qui espère encore qu'on lui réponde !
(Merci quand même à celui qui a essayé de m'aider)

par lacfab » 21 oct. 2006, 15:54

Salut
Alors j'ai modifié un peu tout ça ... j'ai des résultats bizarres à chaque fois !
CODE :

Code : Tout sélectionner

<? switch ($page){ default : echo "<center>Choisir l'image à envoyer :<br> <form method='post' action='?page=suite&nomimage=".$nomimage."' enctype='multipart/form-data'> <input type='hidden' name='MAX_FILE_SIZE' value=''> <input type='file' name='fichier1' size='120'><br> <input type='submit' value='Envoyer'> </form><br><br> Attention en cas de gros fichiers envoyés le traitement peut prendre plusieurs minutes !<br> Pour accélérer ce temps, réduisez la taille de vos prises de vues (réglage sur l'appareil),<br> ou réduisez celle ci sur l'ordinateur.</center>"; break; case "suite": function thumbnail($file, $name, $ext){ list($imgWidth, $imgHeight, $type, $attr) = getimagesize($file); if ($type !=2){ if ($ext=="big"){ echo "<center>ERREUR<br> L'image doit être en JPG uniquement.<br></center>"; } } else{ //Dimensions de l'image et extension $repertoire = "/home/lefuretr/www/casacollector/produits/"; if ($ext!="big"){ $extens= "_mini.jpg"; $maxWidth = "80"; $maxHeight = "80"; } else{ $extens=".jpg"; $maxWidth = "700"; $maxHeight = "500"; } //Fixe les dimensions du thumb en testant si l'image n'est pas plus petite que les dimensions imposées if($ext=="big" AND ($imgWidth<$maxWidth AND $imgHeight<$maxHeight)){ move_uploaded_file($file, $repertoire.$name.$extens); } else{ //Facteur largeur/hauteur des dimensions max $whFact = $maxWidth/$maxHeight; //Facteur largeur/hauteur de l'original $imgWhFact = $imgWidth/$imgHeight; if($whFact < $imgWhFact){//Si largeur déterminante $thumbWidth = $maxWidth; $thumbHeight = $thumbWidth/$imgWhFact; } else { //Si hauteur déterminante $thumbHeight = $maxHeight; $thumbWidth = $thumbHeight*$imgWhFact; } //Crée le thumb (image réduite) $imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight); //Insère l'image de base redimensionnée ImageCopyResized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight); //Nom du fichier thumb $imgThumbName = $repertoire.$name.$extens; //Crée le fichier thumb $fp = fopen($imgThumbName, "w"); fclose($fp); //Renvoie le thumb créé ImageJpeg($imgThumb, $imgThumbName); return $imgThumbName; } } } thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"big"); thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"vign"); echo "<center><br><br><a href='produits_ajout.php' target='b'>Retour</a>"; break;
Si j'envoie une image de 1000x800 (donc supérieure aux normes maximale définie dans le script)
RESULTAT OK


Si j'envoie une image de 400x350 :
Il me balance l'image originale MAIS ne créé pas de vignette OU alors m'en crée une à 0Ko
Erreur : Warning: getimagesize(/tmp/phpAhVsHi) [function.getimagesize]: failed to open stream: No such file or directory in /home/lefuretr/www/casacollector/acces/upload.php on line 43

par lacfab » 21 oct. 2006, 02:56

salut merci pour ta réponse

Donc tu veux dire que

Code : Tout sélectionner

if($ext=="big" AND ($imgWidth>$maxWidth OR $imgHeight>$maxHeight)){
ne peut pas fonctionner et que je dois utiliser getimagesize() c'est ça ?

++
Lacfab

par Ryle » 19 oct. 2006, 12:03

Avec la fonction getImageSize() tu peux récupérer la hauteur et largeur de l'image que tu passes en paramètre. Tu peux ainsi comparer à tes critères de taille avec un if() et s'ils sont tout deux supérieur à la taille de l'image, il te suffit de ne pas exécuter le code de redimensionnement :)

Pour l'optimisation, je ne sais pas trop si cela peut se gérer, mais il me semble que l'utilisation de ImageCreateTruecolor() avait un effet d'optimisation suffisant...
Dans tous les cas, il te suffit de contrôler la taille du fichier initial, les versions jpeg réduite seront normalement toujours inférieures en poids :)

par lacfab » 19 oct. 2006, 01:40

De même si une image portant un nom similaire est déjà en place ... ça fait une erreur : la vignette est ben remplacée mais la grande image ne veut rien savoir :'(

Upload et redimention image

par lacfab » 19 oct. 2006, 01:38

Salut,

après de nombreuses recherche sur le net (dont ce forum) je n'ai pas trouvé réponse à mon problème.
Voici de quoi il sagit : on entre un produit via la page d'ajout. On peut ensuite ajouter une image à ce produit en cliquant sur un lien. L'image est recadrée en 700 de large OU 500 de haut et renommée REFERENCE.jpg, cette image est retravaillée et recadrée en 80 de large OU 80 de haut et renommée REFERENCE_mini.jpg (en gros il fait une vignette)
Le problème est le suivant : il crée bien les images mais je veux que si l'image est plus petites que les normes définies (700x500 dans mon script) qu'elle ne soit pas touchée d'un poil et envoyée tel quel
De même comment peut on gérer la compression ? car une image peut entrer dans les normes définies mais faire 150ko ... il faudrait pouvoir réduire ça.
Voici mon code :

Code : Tout sélectionner

<? switch ($page){ default : echo "<center>Choisir l'image à envoyer :<br> <form method='post' action='?page=suite&nomimage=".$nomimage."' enctype='multipart/form-data'> <input type='hidden' name='MAX_FILE_SIZE' value=''> <input type='file' name='fichier1' size='120'><br> <input type='submit' value='Envoyer'> </form><br><br> Attention en cas de gros fichiers envoyés le traitement peut prendre plusieurs minutes !<br> Pour accélérer ce temps, réduisez la taille de vos prises de vues (réglage sur l'appareil),<br> ou réduisez celle ci sur l'ordinateur.</center>"; break; case "suite": function thumbnail($file, $name, $ext, $maxWidth, $maxHeight){//Créer une image à partir de $file $img = ImageCreateFromJpeg("$file"); //Dimensions de l'image $imgWidth = imagesx($img); $imgHeight = imagesy($img); if ($ext!="big"){ $extens= "_mini.jpg"; } else{ $extens=".jpg"; } //Fixe les dimensions du thumb en testant si l'image n'est pas plus petite que les dimensions imposées if($ext=="big" AND ($imgWidth>$maxWidth OR $imgHeight>$maxHeight)){ $repertoire = "/home/lefuretr/www/casacollector/produits/"; move_uploaded_file($_FILES['fichier1']['tmp_name'], $repertoire.$name.$extens); } else{ //Facteur largeur/hauteur des dimensions max $whFact = $maxWidth/$maxHeight; //Facteur largeur/hauteur de l'original $imgWhFact = $imgWidth/$imgHeight; if($whFact < $imgWhFact){//Si largeur déterminante $thumbWidth = $maxWidth; $thumbHeight = $thumbWidth/$imgWhFact; } else { //Si hauteur déterminante $thumbHeight = $maxHeight; $thumbWidth = $thumbHeight*$imgWhFact; } //Crée le thumb (image réduite) $imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight); //Insère l'image de base redimensionnée ImageCopyResized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight); //Nom du fichier thumb $imgThumbName = "/home/lefuretr/www/casacollector/produits/".$name.$extens; } //Crée le fichier thumb $fp = fopen($imgThumbName, "w"); fclose($fp); //Renvoie le thumb créé ImageJpeg($imgThumb, $imgThumbName); return $imgThumbName; } thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"big",700,500); thumbnail($_FILES['fichier1']['tmp_name'],$nomimage,"vign",80,80); echo "<center><br><br>L'image a été envoyée avec succès<br><br><a href='produits_ajout.php' target='b'>Retour</a>"; break; } ?>
MERCI d'avance