Page 1 sur 2

redimensionner une image en proportion

Posté : 11 avr. 2012, 10:14
par cris84
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;
  
  } ?>

Re: redimensionner une image en proportion

Posté : 11 avr. 2012, 21:22
par albat
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 ?

Re: redimensionner une image en proportion

Posté : 11 avr. 2012, 23:13
par cris84
Bonsoir,

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

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 05:09
par cezame
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;
}

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 13:36
par cris84
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>
     
   

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 16:56
par cezame
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.

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 18:36
par cris84
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 ?

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 19:17
par cris84
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>
     
   

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 19:55
par AB
T'as un exemple ici

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 20:23
par albat
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);
      }

Re: redimensionner une image en proportion

Posté : 12 avr. 2012, 21:28
par cezame
Oui appel ta fonction avec les paramètres que tu désires.

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

Re: redimensionner une image en proportion

Posté : 13 avr. 2012, 13:16
par cris84
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>
     
   

Re: redimensionner une image en proportion

Posté : 13 avr. 2012, 13:57
par Mazarini
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.

Re: redimensionner une image en proportion

Posté : 13 avr. 2012, 14:44
par cris84
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. :|

Re: redimensionner une image en proportion

Posté : 13 avr. 2012, 14:58
par Mazarini
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().