redimensionner une image en proportion

Eléphant du PHP | 233 Messages

11 avr. 2012, 10:14

Bonjour à tous,

je voudrais redimensionner proportionnellement mes images uploadées en modifiant le code ci-dessous :

Y-a-t-il une fonction automatique ?

Merci de votre aide...
 // miniature <?php 
$dim = getimagesize($repertoire.$nom_fichier);
  
  switch($dim[2]){
  
  case 2:
$image = imagecreatefromjpeg($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor(200,200);
imagecopyresampled($resized_image,$image,0,0,0,0,200,200,$dim[0],$dim[1]); 
imagejpeg($resized_image,"IMG/photos/mini/".$nom_fichier); 
  break;
  
  case 1:
$image = imagecreatefromgif($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor(200,200);
imagecopyresampled($resized_image,$image,0,0,0,0,200,200,$dim[0],$dim[1]); 
imagegif($resized_image,"IMG/photos/mini/".$nom_fichier); 
  break;
  
  case 3:
$image = imagecreatefrompng($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor(200,200);
imagecopyresampled($resized_image,$image,0,0,0,0,200,200,$dim[0],$dim[1]); 
imagepng($resized_image,"IMG/photos/mini/".$nom_fichier); 
  break;
  
  } ?>

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

11 avr. 2012, 21:22

Je ne sais pas s'il existe une fonction pour faire une règle de 3,
mais si ce n'est pas le cas, ce n'est pas compliqué à coder.

Quelles sont les proportions que tu as définies ?

Eléphant du PHP | 233 Messages

11 avr. 2012, 23:13

Bonsoir,

actuellement 200 x 200 mais c'est bien évidement pas proportionnel aux images réelles uploadées... :?

Eléphanteau du PHP | 25 Messages

12 avr. 2012, 05:09

Bonjour,
Voici une fonction qui te permet de "cropper" une image en utilisant la librairie GD comme t'as essayé de le faire, sauf que tu as oublié de gérer le ratio pour les proportions de redimensionnement.
La fonction prend en charge les images jpg, png et gif et te sort l'image en .jpg ( tu peux remplacer la fonction imagejpeg par l'équivalente png )
/**
 * Permet de cropper une image au format png/jpg et gif au format souhaité
 *
 * Si la largeur ou la hauteur est mise à 0 la dimension sera automatiquement calculé
 * de manière à garder le ratio de l'image
 *
 * @param string $img Fichier image d'origine (doit avoir une extension)
 * @param string $dest Fichier de destination (avec l'extension .jpg)
 * @param integer $largeur Largeur de l'image en sortie
 * @param integer $hauteur Hauteur de l'image en sortie
 */
function crop($img,$dest,$largeur=0,$hauteur=0){
        $dimension=getimagesize($img);
        $ratio = $dimension[0] / $dimension[1];
        // Création des miniatures
        if($largeur==0 && $hauteur==0){ $largeur = $dimension[0]; $hauteur = $dimension[1]; }
          else if($hauteur==0){ $hauteur = round($largeur / $ratio); }
        else if($largeur==0){ $largeur = round($hauteur * $ratio); }
  
        if($dimension[0]>($largeur/$hauteur)*$dimension[1] ){ $dimY=$hauteur; $dimX=round($hauteur*$dimension[0]/$dimension[1]); $decalX=($dimX-$largeur)/2; $decalY=0;}
        if($dimension[0]<($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=round($largeur*$dimension[1]/$dimension[0]); $decalY=($dimY-$hauteur)/2; $decalX=0;}
        if($dimension[0]==($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=$hauteur; $decalX=0; $decalY=0;}
        $miniature =imagecreatetruecolor ($largeur,$hauteur);
        $ext = end(explode('.',$img));
        if(in_array($ext,array('jpeg','jpg','JPG','JPEG'))){$image = imagecreatefromjpeg($img); }
        elseif(in_array($ext,array('png','PNG'))){$image = imagecreatefrompng($img); }
        elseif(in_array($ext,array('gif','GIF'))){$image = imagecreatefromgif($img); }
        else{ return false; }
        imagecopyresampled($miniature,$image,-$decalX,-$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
        imagejpeg($miniature,$dest,90);
          
        return true;
}

Eléphant du PHP | 233 Messages

12 avr. 2012, 13:36

merci mais comment adapter ce code au mien ?
je le donne en entier c'est le mieux :
<?php
//upload des photos pour la galerie personnelle
$perso=isset($_REQUEST['perso']) ? $_REQUEST['perso'] : null;
//si c'est le formulaire de photo de galerie perso
    if($perso == 'ok'){
    //10 photos persos dans la galerie maximum
    $l=$_SESSION['valid'];
       $requ="SELECT COUNT(*) as nbphotogal from hadphoto where pseudo='$l'";
       $resu=mysql_query($requ,$cnx);
       $nbphotogal=mysql_fetch_assoc($resu);
       if($nbphotogal['nbphotogal']<10){
       
           $poids_max = 1024000; // Poids max de l'image en octets (1Ko = 1024 octets)
    $repertoire = 'IMG/photos/'; // Repertoire d'upload
     
    if (isset($_FILES['fichier']))
   {
      $dime=getimagesize($_FILES['fichier']['tmp_name']);
      // On vérifie le type du fichier
      if ($dime[2]!=1 && $dime[2]!=2 && $dime[3]!=3)
      {
         $erreur = '<h5><br>Le fichier doit être au format *.jpeg, *.gif ou *.png .<br><br></h5>';
      }
      
      // On vérifie le poids de l'image
      elseif ($_FILES['fichier']['size'] > $poids_max)
   {
   $erreur = '<h5><br>Le poid de l\'image doit être inférieur à ' . $poids_max/1024000 . 'Mo.<br></h5>';
      }
      
     // On vérifie si le répertoire d'upload existe
      elseif (!file_exists($repertoire))
      {
         $erreur = 'Erreur, le dossier d\'upload n\'existe pas.';
   }
    
   // Si il y a une erreur on l'affiche sinon on peut uploader
      if(isset($erreur))
      {
         echo $erreur;
    }
      else
      {
            
         // On définit l'extention du fichier puis on le nomme par le pseudo+time actuel
   if ($dime[2]==2) { $extention = '.jpg'; }
   if ($dime[2]==3) { $extention = '.png'; }
   if ($dime[2]==1) { $extention = '.gif'; }
   $nom_fichier = $l.time().$extention;
    
   // On upload le fichier sur le serveur.
   if (move_uploaded_file($_FILES['fichier']['tmp_name'], $repertoire.$nom_fichier))
   {
  
  // miniatures
  
  $dim = getimagesize($repertoire.$nom_fichier);
  
  switch($dim[2]){
  
  case 2:
$image = imagecreatefromjpeg($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor(200,200);
imagecopyresampled($resized_image,$image,0,0,0,0,200,200,$dim[0],$dim[1]); 
imagejpeg($resized_image,"IMG/photos/mini/".$nom_fichier); 
  break;
  
  case 1:
$image = imagecreatefromgif($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor(200,200);
imagecopyresampled($resized_image,$image,0,0,0,0,200,200,$dim[0],$dim[1]); 
imagegif($resized_image,"IMG/photos/mini/".$nom_fichier); 
  break;
  
  case 3:
$image = imagecreatefrompng($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor(200,200);
imagecopyresampled($resized_image,$image,0,0,0,0,200,200,$dim[0],$dim[1]); 
imagepng($resized_image,"IMG/photos/mini/".$nom_fichier); 
  break;
  
  }

   //on supprime la grosse on ne garde que les vignettes pour le moment
   unlink($repertoire.$nom_fichier);
   $repertoire="IMG/photos/mini/";
   
   //fin mini
   
   
   $req2="INSERT INTO hadphoto(pseudo,photo) VALUES('$l','$repertoire$nom_fichier')";
   $res2=mysql_query($req2,$cnx);
   $newavatar=$repertoire.$nom_fichier;
   echo '<h6><br>Votre photo a bien été ajoutée.<br><br></h6>';
   }
  else
   {
   echo '<h5><br>L\'image n\'a pas pu être uploadée.<br><br></h5>';
        }
        
     }
      
   }
   }
   else{
   echo '<h5><br>Pas plus de 10 photos dans la galerie.<br><br></h5>';
   }
}  

    ?>
      <form method="POST" action="index.php?genre=photos&perso=ok" enctype="multipart/form-data">
        
         <input type="file" name="fichier">
         <input type="submit" value="Envoyer">
       
            </form>
     
   

Eléphanteau du PHP | 25 Messages

12 avr. 2012, 16:56

Tu rend la fonction dispo dans ton script et tu l'utilises, il me semble que t'as pas besoin de move_uploaded_file, t'as juste a crop() avec comme image source $_FILES['fichier']['tmp_name'] directement.

Eléphant du PHP | 233 Messages

12 avr. 2012, 18:36

il y a je pense trop de choses à modifier, y-a-t-il pas quelque chose de plus simple à adapter ?
en gardant case 1, case 2 et case 3 ?

Eléphant du PHP | 233 Messages

12 avr. 2012, 19:17

J'ai modifié le script comme ci-dessus, cela fonctionne mais mon image et toujours en 200x200 et toujours non proportionnelle :?:
Avez vous une idée :idea:
<?php
//upload des photos pour la galerie personnelle
$perso=isset($_REQUEST['perso']) ? $_REQUEST['perso'] : null;
//si c'est le formulaire de photo de galerie perso
    if($perso == 'ok'){
    //10 photos persos dans la galerie maximum
    $l=$_SESSION['valid'];
       $requ="SELECT COUNT(*) as nbphotogal from hadphoto where pseudo='$l'";
       $resu=mysql_query($requ,$cnx);
       $nbphotogal=mysql_fetch_assoc($resu);
       if($nbphotogal['nbphotogal']<10){
       
           $poids_max = 1024000; // Poids max de l'image en octets (1Ko = 1024 octets)
    $repertoire = 'IMG/photos/'; // Repertoire d'upload
     
    if (isset($_FILES['fichier']))
   {
      $dime=getimagesize($_FILES['fichier']['tmp_name']);
      // On vérifie le type du fichier
      if ($dimension[2]!=1 && $dimension[2]!=2 && $dimension[3]!=3)
     {
         $erreur = '<h5><br>Le fichier doit être au format *.jpeg, *.gif ou *.png .<br><br></h5>';
      }
      
      // On vérifie le poids de l'image
      elseif ($_FILES['fichier']['size'] > $poids_max)
   {
   $erreur = '<h5><br>Le poid de l\'image doit être inférieur à ' . $poids_max/1024000 . 'Mo.<br></h5>';
      }
      
     // On vérifie si le répertoire d'upload existe
      elseif (!file_exists($repertoire))
      {
         $erreur = 'Erreur, le dossier d\'upload n\'existe pas.';
   }
    
   // Si il y a une erreur on l'affiche sinon on peut uploader
      if(isset($erreur))
      {
         echo $erreur;
    }
      else
      {
            
         // On définit l'extention du fichier puis on le nomme par le pseudo+time actuel
   if ($dimension[2]==2) { $extention = '.jpg'; }
   if ($dimension[2]==3) { $extention = '.png'; }
   if ($dimension[2]==1) { $extention = '.gif'; }
   $nom_fichier = $l.time().$extention;
    
   // On upload le fichier sur le serveur.
   if (move_uploaded_file($_FILES['fichier']['tmp_name'], $repertoire.$nom_fichier))
   {
  
  
function crop($img,$largeur=0,$hauteur=0){
        $dimension=getimagesize($img);
        $ratio = $dimension[0] / $dimension[1];
        // Création des miniatures
        if($largeur==0 && $hauteur==0){ $largeur = $dimension[0]; $hauteur = $dimension[1]; }
          else if($hauteur==0){ $hauteur = round($largeur / $ratio); }
        else if($largeur==0){ $largeur = round($hauteur * $ratio); }
 
        if($dimension[0]>($largeur/$hauteur)*$dimension[1] ){ $dimY=$hauteur; $dimX=round($hauteur*$dimension[0]/$dimension[1]); $decalX=($dimX-$largeur)/2; $decalY=0;}
        if($dimension[0]<($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=round($largeur*$dimension[1]/$dimension[0]); $decalY=($dimY-$hauteur)/2; $decalX=0;}
        if($dimension[0]==($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=$hauteur; $decalX=0; $decalY=0;}
        $miniature =imagecreatetruecolor ($largeur,$hauteur);
        $ext = end(explode('.',$img));
        if(in_array($ext,array('jpeg','jpg','JPG','JPEG'))){$image = imagecreatefromjpeg($img); }
        elseif(in_array($ext,array('png','PNG'))){$image = imagecreatefrompng($img); }
        elseif(in_array($ext,array('gif','GIF'))){$image = imagecreatefromgif($img); }
        else{ return false; }
        imagecopyresampled($miniature,$image,-$decalX,-$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
        imagejpeg($miniature,"IMG/photos/mini/",90);
         
        return true;
}
 
   //on supprime la grosse on ne garde que les vignettes pour le moment
   unlink($repertoire.$nom_fichier);
   $repertoire="IMG/photos/mini/";
   
   //fin mini
   
   
   $req2="INSERT INTO hadphoto(pseudo,photo) VALUES('$l','$repertoire$nom_fichier')";
   $res2=mysql_query($req2,$cnx);
   $newavatar=$repertoire.$nom_fichier;
   echo '<h6><br>Votre photo a bien été ajoutée.<br><br></h6>';
   }
  else
   {
   echo '<h5><br>L\'image n\'a pas pu être uploadée.<br><br></h5>';
        }
        
     }
      
   }
   }
   else{
   echo '<h5><br>Pas plus de 10 photos dans la galerie.<br><br></h5>';
   }
}  

    ?>
      <form method="POST" action="index.php?genre=photos&perso=ok" enctype="multipart/form-data">
        
         <input type="file" name="fichier">
         <input type="submit" value="Envoyer">
       
            </form>
     
   

ViPHP
AB
ViPHP | 5818 Messages

12 avr. 2012, 19:55

T'as un exemple ici

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

12 avr. 2012, 20:23

Pour calculer tes nouvelles dimensions en conservant les proportions de l'original :
$h_new = 200; // hauteur de la vignette initialisée à 200 px
$l_new = 200; // largeur de la vignette initialisée à 200 px

if ($h_old > $l_old) // image en mode portrait
   { $l_new = round($l_old * 200 / $h_old);
   }
   else
   if ($l_old > $h_old) // image en mode paysage
      { $h_new = round($h_old * 200 / $l_old);
      }

Eléphanteau du PHP | 25 Messages

12 avr. 2012, 21:28

Oui appel ta fonction avec les paramètres que tu désires.

crop($img_source,$img_dest,200,200);

Eléphant du PHP | 233 Messages

13 avr. 2012, 13:16

Bonjour,

pas mieux, j'ai toujours l'image uploadée en 200 X 200 mais pas proportionnellement. Mon image initiale fait 201 X 251 après uploade elle fait 200 X 200 mais elle est déformée. Je vous joins le code intégral sait-on jamais... :shock:
<?php
//upload des photos pour la galerie personnelle
$perso=isset($_REQUEST['perso']) ? $_REQUEST['perso'] : null;
//si c'est le formulaire de photo de galerie perso
    if($perso == 'ok'){
    //10 photos persos dans la galerie maximum
    $l=$_SESSION['valid'];
       $requ="SELECT COUNT(*) as nbphotogal from hadphoto where pseudo='$l'";
       $resu=mysql_query($requ,$cnx);
       $nbphotogal=mysql_fetch_assoc($resu);
       if($nbphotogal['nbphotogal']<10){
       
           $poids_max = 1024000; // Poids max de l'image en octets (1Ko = 1024 octets)
    $repertoire = 'IMG/photos/'; // Repertoire d'upload
     
    if (isset($_FILES['fichier']))
   {
      $dime=getimagesize($_FILES['fichier']['tmp_name']);
      // On vérifie le type du fichier
      if ($dime[2]!=1 && $dime[2]!=2 && $dime[3]!=3)
      {
         $erreur = '<h5><br>Le fichier doit être au format *.jpeg, *.gif ou *.png .<br><br></h5>';
      }
      
      // On vérifie le poids de l'image
      elseif ($_FILES['fichier']['size'] > $poids_max)
   {
   $erreur = '<h5><br>Le poid de l\'image doit être inférieur à ' . $poids_max/1024000 . 'Mo.<br><br></h5>';
      }
      
     // On vérifie si le répertoire d'upload existe
      elseif (!file_exists($repertoire))
      {
         $erreur = 'Erreur, le dossier d\'upload n\'existe pas.';
   }
    
   // Si il y a une erreur on l'affiche sinon on peut uploader
      if(isset($erreur))
      {
         echo $erreur;
    }
      else
      {
            
        // On définit l'extention du fichier puis on le nomme par le pseudo+time actuel
   //if ($dime[2]==2) { $extention = '.jpg'; }
   //if ($dime[2]==3) { $extention = '.png'; }
   //if ($dime[2]==1) { $extention = '.gif'; }
   $nom_fichier = $des;
    
  // On upload le fichier sur le serveur.
   if (move_uploaded_file($_FILES['fichier']['tmp_name'], $repertoire.$nom_fichier))
   {
  
  // miniatures
 $h_new = 200; // hauteur de la vignette initialisée à 200 px
$l_new = 200; // largeur de la vignette initialisée à 200 px

if ($h_old > $l_old) // image en mode portrait
   { $l_new = round($l_old * 200 / $h_old);
   }
   else
   if ($l_old > $h_old) // image en mode paysage
      { $h_new = round($h_old * 200 / $l_old);
      }
	  
  function crop($img,$des,$largeur=20O,$hauteur=200){
        $dimension=getimagesize($img);
        $ratio = $dimension[0] / $dimension[1];
        // Création des miniatures
        if($largeur==0 && $hauteur==0){ $largeur = $dimension[0]; $hauteur = $dimension[1]; }
          else if($hauteur==0){ $hauteur = round($largeur / $ratio); }
        else if($largeur==0){ $largeur = round($hauteur * $ratio); }
 
        if($dimension[0]>($largeur/$hauteur)*$dimension[1] ){ $dimY=$hauteur; $dimX=round($hauteur*$dimension[0]/$dimension[1]); $decalX=($dimX-$largeur)/2; $decalY=0;}
        if($dimension[0]<($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=round($largeur*$dimension[1]/$dimension[0]); $decalY=($dimY-$hauteur)/2; $decalX=0;}
        if($dimension[0]==($largeur/$hauteur)*$dimension[1]){ $dimX=$largeur; $dimY=$hauteur; $decalX=0; $decalY=0;}
        $miniature =imagecreatetruecolor ($largeur,$hauteur);
        $ext = end(explode('.',$img));
        if(in_array($ext,array('jpeg','jpg','JPG','JPEG'))){$image = imagecreatefromjpeg($img); }
        elseif(in_array($ext,array('png','PNG'))){$image = imagecreatefrompng($img); }
        elseif(in_array($ext,array('gif','GIF'))){$image = imagecreatefromgif($img); }
        else{ return false; }
        imagecopyresampled($miniature,$image,-$decalX,-$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]);
        imagejpeg($miniature,"IMG/photos/mini/".$nom_fichier,90);
         
        return true;
}

   //on supprime la grosse on ne garde que les vignettes pour le moment
   unlink($repertoire.$nom_fichier);
   $repertoire="IMG/photos/mini/perso/";
   
   //fin mini
   
   
   $req2="INSERT INTO hadphoto(pseudo,photo) VALUES('$l','$repertoire$nom_fichier')";
   $res2=mysql_query($req2,$cnx);
   $newavatar=$repertoire.$nom_fichier;
   echo '<h6><br>Votre photo a bien été ajoutée.<br></h6>';
   }
  else
   {
   echo '<h5><br>L\'image n\'a pas pu être uploadée.<br><br></h5>';
        }
        
     }
      
   }
   }
   else{
   echo '<h5><br>Pas plus de 10 photos dans la galerie.<br><br></h5>';
   }
}  


    ?>
      <form method="POST" action="index.php?genre=photos&perso=ok" enctype="multipart/form-data">
        
         <input type="file" name="fichier">
         <input type="submit" value="Envoyer">
       
            </form>
     
   

ViPHP
ViPHP | 2577 Messages

13 avr. 2012, 13:57

Une première remarque, on ne met pas une fonction en plein milieu du code. Le plus simple est de la mettre au début ou dans un fichier que tu inclues.
Ensuite, je n'ai pas vu ou tu appelais la fonction crop().

Pour résoudre ton problème, il faut ajouter des lignes pour afficher les résultats de tes calculs et voir ainsi à quel moment il y a une erreur.

Eléphant du PHP | 233 Messages

13 avr. 2012, 14:44

la fonction crop est pourtant dans le code. Concernant l'include, pour le moment je test, je pourrais le faire après.
Concernant l'affichage, c'est sur un autre fichier.
Dans l'immédiat, je souhaite simplement uploader mon image dans le fichier IMG/mini proportionnellement. L'uploade se passe bien mais toujours sans radio hauteur largeur. :|

ViPHP
ViPHP | 2577 Messages

13 avr. 2012, 14:58

La fonction est dans le code, mais il faut l'appeler, c'est à dire une ligne :
crop($img,$des,$l_new,$h_new);

Pour ce qui est des proportions de l'image, je soupçonne un <img src="????" width="200" hight="200">
Il faudrait mettre <img src="????"> en le complétant éventuellement avec les dimensions obtenues par getimagesize().