ratio d'images miniature

Mammouth du PHP | 620 Messages

02 août 2009, 18:29

bonjour, (déjà jolie travail pour le nouveau forum php france)

alors voilà j'ai un code qui me permet de créer des miniature d'image stocké dans un repertoire.
ce code permet avec un radio de donnée la hauteur maxi de l'image miniature a afficher.
jusque la tout fonctionne très bien.
maintenant pour une question de mise en page je voudrai avoir maxi en hauteur 130 et maxi en largeur 173 le out sans deformer mes images.
voilà mon code que je n'arrive pas a adapté et qui applique pour le moment un radio de 130 pour la hauteur.
pouvez vous m'aider ?
<?php

// on défini notre ratio pour nos miniatures (la hauteur de la miniature)
$ratio = 130;  
// on défini le répertoire qui contient nos images de grande taille  
$dir = '../images/galerie/';  
 
// si aucune image n'est donnée en arguments, on redirige le visiteur vers l'accueil de la galerie  
if (!isset($_GET['f'])) { 
   header('location: references-escaliers-vosges.php'); 
   exit();  
}  
else { 
   // on récupère le nom de fichier à miniaturiser 
   $image = $_GET['f']; 
   // on récupère les infos de cette image 
   $tableau = @getimagesize('../images/galerie/'.$image); 
   // si il ne s'agit pas d'un fichier image, on redirige le visiteur vers l'accueil de la galerie 
   if ($tableau == FALSE) { 
      header('location: references-escaliers-vosges.php'); 
      exit(); 
   } 
   else { 
      // si notre image est de type jpeg 
      if ($tableau[2] == 2) { 
         // on crée une image à partir de notre grande image à l'aide de la librairie GD 
         $src = imagecreatefromjpeg($dir.'/'.$image); 
         // on teste si notre image est de type paysage ou portrait 
         if ($tableau[0] > $tableau[1]) { 
            $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]); 
         } 
         else { 
            $im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1])); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]); 
         } 
         // contrairement au premier cas où l'on créait un fichier sur le disque dur, ici, comme on génère des images à la volée, on envoie un header au navigateur web du visiteur lui disant que le fichier mini.php va en fait générer une image de type jpeg, soit du type mime image/jpeg. 
         header ("Content-type: image/jpeg"); 
         imagejpeg ($im); 
      } 
      elseif ($tableau[2] == 3) { 
         $src = imagecreatefrompng($dir.'/'.$image); 
         if ($tableau[0] > $tableau[1]) { 
            $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]); 
         } 
         else { 
            $im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1])); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]); 
         } 
         header ("Content-type: image/png"); 
         imagepng ($im); 
      } 
   }  
}  
?> 

Eléphant du PHP | 369 Messages

02 août 2009, 20:01

Salut et/ou re,
bonjour, (déjà jolie travail pour le nouveau forum php france)
alors voilà j'ai un code qui me permet de créer des miniature d'image stocké dans un repertoire.
ce code permet avec un radio de donnée la hauteur maxi de l'image miniature a afficher.
jusque la tout fonctionne très bien.
maintenant pour une question de mise en page je voudrai avoir maxi en hauteur 130 et maxi en largeur 173 le out sans deformer mes images.
voilà mon code que je n'arrive pas a adapté et qui applique pour le moment un radio de 130 pour la hauteur.
pouvez vous m'aider ?
[...]
Pour ce qui est du ratio l'algorithme bresenham fait ca très bien. en tout cas de mon côté
c'est ainsi que je fonctionne. Cherche du côte long_origine /long_finale. Tu obtiens un %, % que tu
exploites pour obtenir ta largeur_finale.

Mieux qu'unlong discour: http://fr.wikipedia.org/wiki/Algorithme ... _Bresenham

Oui, c'est un algo pour tracer des lignes, je sais, mais ca revient au même ;)

@+ bon code ;)

Mammouth du PHP | 620 Messages

02 août 2009, 21:43

bon alors voilà j'ai modifié mon code et ajouter une largeur maxi et une hauteur maxi.
le probleme et que les miniature ne prennent pas toujours les valeurs maxi données. j'ai bien toujours sur les miniatures une des 2 valeures maxi de 130 ou 173 mais certaines minatures on comme valeurs par exemple 173 x 231 ou 195 x 130 et du coup je depasse la taille maxi de la miniature qui ne devrait pas dépasser en largeur 173 et en hauteur 130.

voici mon code modifié :
/ on défini les tailles maxi pour nos miniatures

$hauteur_max = 130;  
$largeur_max = 173;  

// on défini le répertoire qui contient nos images de grande taille  
$dir = '../images/galerie/';  
 
// si aucune image n'est donnée en arguments, on redirige le visiteur vers l'accueil de la galerie  
if (!isset($_GET['f'])) { 
   header('location: galerie-photos-vosges.php'); 
   exit();  
}  
else { 
   // on récupère le nom de fichier à miniaturiser 
   $image = $_GET['f']; 
   // on récupère les infos de cette image 
   $tableau = @getimagesize('../images/galerie/'.$image); 
   // si il ne s'agit pas d'un fichier image, on redirige le visiteur vers l'accueil de la galerie 
   if ($tableau == FALSE) { 
      header('location: galerie-photos-vosges.php'); 
      exit(); 
   } 
   else { 
      // si notre image est de type jpeg 
      if ($tableau[2] == 2) { 
         // on crée une image à partir de notre grande image à l'aide de la librairie GD 
         $src = imagecreatefromjpeg($dir.'/'.$image); 
         // on teste si notre image est de type paysage ou portrait 
         if ($tableau[0] > $tableau[1]) { 
            $im = imagecreatetruecolor(round(($hauteur_max/$tableau[1])*$tableau[0]), $hauteur_max); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, round(($hauteur_max/$tableau[1])*$tableau[0]), $hauteur_max, $tableau[0], $tableau[1]); 
         } 
         else { 
            $im = imagecreatetruecolor($largeur_max, round(($largeur_max/$tableau[0])*$tableau[1])); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, $largeur_max, round($tableau[1]*($largeur_max/$tableau[0])), $tableau[0], $tableau[1]); 
         } 
         // on génère des images à la volée, on envoie un header au navigateur web du visiteur lui disant que le fichier mini.php va en fait générer une image de type jpeg, soit du type mime image/jpeg. 
         header ("Content-type: image/jpeg"); 
         imagejpeg ($im); 
      } 
      elseif ($tableau[2] == 3) { 
         $src = imagecreatefrompng($dir.'/'.$image); 
         if ($tableau[0] > $tableau[1]) { 
            $im = imagecreatetruecolor(round(($hauteur_max/$tableau[1])*$tableau[0]), $hauteur_max); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, round(($hauteur_max/$tableau[1])*$tableau[0]), $hauteur_max, $tableau[0], $tableau[1]); 
         } 
         else { 
            $im = imagecreatetruecolor($largeur_max, round(($largeur_max/$tableau[0])*$tableau[1])); 
            imagecopyresampled($im, $src, 0, 0, 0, 0, $largeur_max, round($tableau[1]*($largeur_max/$tableau[0])), $tableau[0], $tableau[1]); 
         } 
         header ("Content-type: image/png"); 
         imagepng ($im); 
      } 
   }  
}  

Mammouth du PHP | 991 Messages

03 août 2009, 10:51

Je m'excuse je n'ai pas trop le temps de te donner du code précis , mais voici comment je procèderai

Tout d'abord je récupère la taille de l'image (hauteur largeur),
Ensuite je regarde si elle est plus grande en largeur ou hauteur,
Je regarde la quelle est la plus grande (Format paysage ou portrait)
Ensuite je détermine la taille de la miniature
$ratio = $hauteur_origine / $largeur_origine;

$maxi = 130; // En fonction de ta plus grande longueur donc forcement différents si c en paysage ou portrait

$hauteur = $maxi;
$largeur = $maxi * $ratio;

Et ensuite ton code de redimension

Je pense que cela devrais te convenir
Bye hawk
DevOps, Symfony4, Hoa