Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1384 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Problème dimension image

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème dimension image

n°1543937
wildschwei​n
Posté le 17-04-2007 à 17:40:45  profilanswer
 

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

mood
Publicité
Posté le 17-04-2007 à 17:40:45  profilanswer
 

n°1543938
MagicBuzz
Posté le 17-04-2007 à 17:47:30  profilanswer
 

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);

n°1543952
wildschwei​n
Posté le 17-04-2007 à 17:58:59  profilanswer
 

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

n°1543965
anapajari
s/travail/glanding on hfr/gs;
Posté le 17-04-2007 à 18:14:17  profilanswer
 

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
n°1543978
wildschwei​n
Posté le 17-04-2007 à 18:25:30  profilanswer
 

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
n°1544076
MagicBuzz
Posté le 18-04-2007 à 00:40:55  profilanswer
 

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 ;))


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Problème dimension image

 

Sujets relatifs
problème avec flash et IEImage en fond d'un JButton
[résolu] Problème d'image de fond avec Firefoxproblème de liens
Problème pour implémenter classe pile en liste chainéeProblème d'affiche d'une page, selon navigateur etc...
[JS] Probléme création d'un bbcode => apercu[WinCE] Probleme lors du linkage avec la STL
probleme de programme en C 
Plus de sujets relatifs à : Problème dimension image


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR