Problème dimension image

Problème dimension image - PHP - Programmation

Marsh Posté le 17-04-2007 à 17:40:45    

calculer la taille d'un tableau
 
Bonjour,
 
J'aimerais résoudre le problème d'affichage suivant : j'ai un nombre x de pixels à afficher (ordre sans importance) et je voudrais les  
afficher dans une image la plus "carrée" possible. (si j'ai 20 pixels, ça devrait donner 5 colonnes et 4 lignes; si j'ai 30 pixels, ça devrait donner 6 colonnes et 5 lignes; etc)
Pour cela, j'ai fait le bout de programme ci-dessous, mais j'aimerais éviter la chose suivante : que 40 = 5x8 et non 10x4. Voyez vous où je peux intervenir ? Et comment optimiser ce code
 

Code :
  1. <?php
  2. if(isset($_GET['taille_image']) && !empty($_GET['taille_image']))
  3. {
  4. $taille_image=$_GET['taille_image'];
  5. echo $taille_image.' soit '.dechex($taille_image).' en hexa<br /><br />';
  6. // Affichage de test
  7. echo 'Multiples de '.$taille_image.'<br /><br />';
  8. function multiples($nbre,$cle=0)
  9. {
  10. $resultat[$cle]=1;
  11. $cle++;
  12. for ($i=2;$i<=$nbre;$i++)
  13. {
  14.  while (is_int($nbre/$i))
  15.  {
  16.   $nbre=$nbre/$i;
  17.   $resultat[$cle]=$i;
  18.   $cle++;
  19.  }
  20. }
  21. return $resultat;
  22. }
  23. $multiples_taille_image=multiples($taille_image);
  24. // Affichage de test
  25. foreach ($multiples_taille_image as $cle=>$valeur)
  26. {
  27.  echo $cle.' => '.$valeur.'<br/>';
  28. }
  29. echo '<br/>';
  30. // Fonction de calcul du produit des valeurs du tableau (php 5)  
  31. if(!function_exists('array_product'))
  32. {
  33. function array_product($tableau=array(),$a=1)
  34. {
  35.  if(is_array($tableau))
  36.  {
  37.   foreach($tableau as $n)
  38.   {
  39.    $a*=$n;
  40.   }
  41.   return $a;
  42.  }
  43.  return NULL;
  44. }
  45. }
  46. $compteur=0;
  47. for ($i=0;$i<sizeof($multiples_taille_image);$i++)
  48. {
  49. $x=0;
  50. while ($x<=$i)
  51. {
  52.  $a[$x]=$multiples_taille_image[$x];
  53.  $x++;
  54. }
  55. while ($x<sizeof($multiples_taille_image))
  56. {
  57.  $b[$x]=$multiples_taille_image[$x];
  58.  $x++;
  59. }
  60. $compteur++;
  61. echo 'a : '.array_product($a).' & b : '.array_product($b).'<br />';
  62. if (array_product($a)>=array_product($b))
  63. {
  64.  // Paragraphe à revoir; cette partie sert à éviter une image
  65.  // disproportionnée quand on tombe sur un multiple d'un grand nombre
  66.  // premier
  67.  if (array_product($b)==1)
  68.  {
  69.   array_splice ($a,0); array_splice ($b,0); // Efface et remplace une portion de tableau  
  70.   for ($i=0;$i<$compteur-1;$i++)
  71.   {
  72.    $x=0;
  73.    while ($x<=$i)
  74.    {
  75.     $a[$x]=$multiples_taille_image[$x];
  76.     $x++;
  77.    }
  78.    while ($x<$compteur)
  79.    {
  80.     $b[$x]=$multiples_taille_image[$x];
  81.     $x++;
  82.    }
  83.    echo 'a : '.array_product($a).' & b : '.array_product($b).'<br />';
  84.    $largeur=array_product($b);
  85.    $hauteur=array_product($a);
  86.    array_splice ($a,0);
  87.    array_splice ($b,0);
  88.   }
  89.  }
  90.  // Et jusque là ////////////////////////////////////////////////////////
  91.  break;
  92.  }
  93.  else
  94.  {
  95.   $largeur=array_product($b);
  96.   $hauteur=array_product($a);
  97.   array_splice ($a,0);
  98.   array_splice ($b,0);
  99.  }
  100. }
  101. echo 'Largeur : '.$largeur.'<br />';
  102. echo 'Hauteur : '.$hauteur.'<br />';
  103. }
  104. ?>
  105. <br /><br />
  106. <form action="?" method="GET"><br />
  107. <input type="text" name="taille_image" />
  108. <input type="submit" value="Submit" />
  109. </form>


 
Merci d'avance
 
Cordialement

Reply

Marsh Posté le 17-04-2007 à 17:40:45   

Reply

Marsh Posté le 17-04-2007 à 17:47:30    

Niveau algo, je dirais bêtement : (pseudo code)
 

Code :
  1. int x = 0, y = 0;
  2.  
  3. x = sqrt(nbpixels);
  4.  
  5. while (x > 0)
  6. {
  7.    y = nbpixels / x;
  8.    if (x * y == nbpixels)
  9.    {
  10.        break;
  11.    }
  12.    x--;
  13. }
  14.  
  15. printf("Meilleure résolution : %d x %d", x, y);

Reply

Marsh Posté le 17-04-2007 à 17:58:59    

Je vais essayer de partir dans cette direction, en tout cas c'est carrément plus synthétique que mon usine à gaz.
 
Merci

Reply

Marsh Posté le 17-04-2007 à 18:14:17    

MagicBuzz a écrit :

Niveau algo, je dirais bêtement : (pseudo code)

 
Code :
  1. int x = 0, y = 0;
  2.  
  3. x = sqrt(nbpixels);
  4.  
  5. while (x > 0)
  6. {
  7.    y = nbpixels / x;
  8.    if (x * y == nbpixels)
  9.    {
  10.        break;
  11.    }
  12.    x--;
  13. }
  14.  
  15. printf("Meilleure résolution : %d x %d", x, y);



THIS IS NOT GONNA WORK :D
Il faut bosser sur la partie entière sur x et y sinon c'est sur que ça va marcher. ( enfin la disons que le     "y = nbpixels / x;
    if (x * y == nbpixels)"  il va tout le temps rentrer dedans ;) )

Code :
  1. function pouet( $size ) {
  2.    $sq = sqrt($size);
  3.    if ( intval($sq) == $sq){
  4.      return array($sq, $sq);
  5.    } else {
  6.     $w = intval($sq);
  7.     while ($w > 0){
  8.       $l = $size / $w;
  9.       if ( intval($l) == $l ){
  10.         return array($l, $w);
  11.       }
  12.       $w --;
  13.     }
  14.      return array(null, null);
  15.    }
  16. }
 


Message édité par anapajari le 17-04-2007 à 18:15:23
Reply

Marsh Posté le 17-04-2007 à 18:25:30    

MagicBuzz a écrit :

Niveau algo, je dirais bêtement : (pseudo code)
 

Code :
  1. int x = 0, y = 0;
  2.  
  3. x = sqrt(nbpixels);
  4.  
  5. while (x > 0)
  6. {
  7.    y = nbpixels / x;
  8.    if (x * y == nbpixels)
  9.    {
  10.        break;
  11.    }
  12.    x--;
  13. }
  14.  
  15. printf("Meilleure résolution : %d x %d", x, y);



 
Ca marche à condition de travailler avec des nombres entiers, j'ai ainsi modifié le code en

Code :
  1. $x=0; $y=0;
  2. $x=sqrt($nbpixels);
  3. $x=ceil($x);
  4. while ($x>0)
  5. {
  6.  $y=$nbpixels/$x;
  7.  $y=ceil($y);
  8.  if ($x*$y==$nbpixels)
  9.  {
  10.   break;
  11.  }
  12.  $x--;
  13. }
  14. printf("Meilleure résolution : %d x %d", $x, $y);
  15. }


 
Merci bien pour votre aide
 
Cordialement

Message cité 1 fois
Message édité par wildschwein le 17-04-2007 à 18:26:56
Reply

Marsh Posté le 18-04-2007 à 00:40:55    

wildschwein a écrit :

Ca marche à condition de travailler avec des nombres entiers, j'ai ainsi modifié le code en

Code :
  1. $x=0; $y=0;
  2. $x=sqrt($nbpixels);
  3. $x=ceil($x);
  4. while ($x>0)
  5. {
  6.  $y=$nbpixels/$x;
  7.  $y=ceil($y);
  8.  if ($x*$y==$nbpixels)
  9.  {
  10.   break;
  11.  }
  12.  $x--;
  13. }
  14. printf("Meilleure résolution : %d x %d", $x, $y);
  15. }


 
Merci bien pour votre aide
 
Cordialement


j'avais esffectivement donné un code (plus ou moins compilable) basé sur la syntaxe du C. et en C, les variables sont effectivement typées (donc le résultat d'un appel à sqrt() ou une division à partir d'entiers ne retourne que des entiers ;))

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed