redimensionner une image en proportion

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 : redimensionner une image en proportion

Re: redimensionner une image en proportion

par cris84 » 13 avr. 2012, 17:26

En fouillant un peu j'ai trouvé beaucoup plus simple sur mon code de départ :P
Voici la solution si cela peut aider quelqu'un

Merci à tous, on peut clore le sujet =D>
$dim = getimagesize($repertoire.$nom_fichier);
  
   $max_width = 200;
$max_height = 200;
list($width, $height) = getimagesize($repertoire.$nom_fichier);
$ratioh = $max_height/$height;
$ratiow = $max_width/$width;
$ratio = min($ratioh, $ratiow);
// New dimensions
$width = intval($ratio*$width);
$height = intval($ratio*$height); 
  
  switch($dim[2]){
  
  case 2:
$image = imagecreatefromjpeg($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor($width,$height);
imagecopyresampled($resized_image,$image,0,0,0,0,$width,$height,$dim[0],$dim[1]); 
imagejpeg($resized_image,"IMG/photos/mini/perso/".$nom_fichier); 
  break;
  
  case 1:
$image = imagecreatefromgif($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor($width,$height);
imagecopyresampled($resized_image,$image,0,0,0,0,$width,$height,$dim[0],$dim[1]); 
imagegif($resized_image,"IMG/photos/mini/perso/".$nom_fichier); 
  break;
  
  case 3:
$image = imagecreatefrompng($repertoire.$nom_fichier);
$resized_image = imagecreatetruecolor($width,$height);
imagecopyresampled($resized_image,$image,0,0,0,0,$width,$height,$dim[0],$dim[1]); 
imagepng($resized_image,"IMG/photos/mini/perso/".$nom_fichier); 
  break;
  
  }

Re: redimensionner une image en proportion

par Mazarini » 13 avr. 2012, 16:03

Ce code ne fera rien :
<?PHP
function toto()
{
   echo 'dans la fonction toto';
}
?>
Par contre ce code affichera bien quelque chose :
<?PHP
function toto()
{
   echo 'dans la fonction toto';
}
toto(); // c'est l'appel de la fonction pour son traitement.
?>
La ligne toto(); fait que le code de la fonction s'exécute. Tu peux même mettre plusieurs lignes comme ca pour qu'elle fasse le traitement plusieurs fois.

Pour finir, si tu mets 20% pour la largeur, il faut aussi mettre 20% pour la hauteur pour garder les proportions.

Re: redimensionner une image en proportion

par cris84 » 13 avr. 2012, 15:52

Je dois donc remplacer la ligne :
function crop($img,$des,$largeur=200,$hauteur=200){
par :
function crop($img,$des,$l_new,$h_new){
?

Concernant l'affichage je l'ai mis en % soit :
echo"<img width='20%'  src=".$ligne['photo'].">";

Re: redimensionner une image en proportion

par Mazarini » 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().

Re: redimensionner une image en proportion

par cris84 » 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. :|

Re: redimensionner une image en proportion

par Mazarini » 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.

Re: redimensionner une image en proportion

par cris84 » 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>
     
   

Re: redimensionner une image en proportion

par cezame » 12 avr. 2012, 21:28

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

par albat » 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);
      }

Re: redimensionner une image en proportion

par AB » 12 avr. 2012, 19:55

T'as un exemple ici

Re: redimensionner une image en proportion

par cris84 » 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>
     
   

Re: redimensionner une image en proportion

par cris84 » 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 ?

Re: redimensionner une image en proportion

par cezame » 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.

Re: redimensionner une image en proportion

par cris84 » 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>
     
   

Re: redimensionner une image en proportion

par cezame » 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;
}