Image aléatoire

theoscar Messages postés 18 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 5 mars 2009 - 24 avril 2007 à 21:25
theoscar Messages postés 18 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 5 mars 2009 - 30 avril 2007 à 11:17
Bonjour à tous !

Voici un code qui affiche une image aléatoire sur une page à partir d'un dossier 'image'. Ce code fonctionne très bien mais j'aimerais que la recherche inclue aussi les sous-répertoires de 'image'. Pourriez vous m'aider?

Voici le code:


<?php 
        //On indique le dossier images 
    $chem_img = "./images"; 
    //On ouvre le dossier images 
    $handle  = opendir($chem_img); 
     
    //On parcoure chaque élément du dossier 
    while ($file = readdir($handle)) 
        { 
            //Si les fichiers sont des images 
            if(preg_match ("!(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$!i", $file)) 
                { 
                    $listef[] = $file; 
                } 
        } 
     
    $random_img = rand(0, count($listef)); //permet de prendre une image totalement au hasard (RANDom) parmi toutes les images trouvées. 
     
    //On calcule la largeur et la hauteur de l'image aléatoire 
    $size = getimagesize($chem_img."/".$listef[$random_img]); 
     
    //Largeur maximale de l'image pour la création des miniatures 
    $largeur_maxi = 500; 
    //Si la largeur dépasse la limite autorisée... 
    if ($size[0] > $largeur_maxi) 
        { 
            //...la nouvelle largeur est égale à la limite à ne pas dépasser 
            $width = $largeur_maxi; 
            //La largeur d'origine divisée par la largeur limitée (on obtient un chiffre qui sert à faire la même proportion pour la hauteur) 
            $theight = ($size[0]/$largeur_maxi); 
            //La hauteur originale est divisée par le chiffre obtenu précédemment afin que l'image conserve les mêmes proportions que l'originale (mais en mode vignette) 
            $height = ($size[1]/$theight); 
        } 
    else 
        { 
            //Sinon on garde la taille originale             $width $size[0]; $height $size[1]; 
        } 
    //On affiche l'image aléatoire (en respectant les standards ! :) ) 
    echo "";
    //On ferme le dossier 
    closedir($handle); 
?> 



merci d'avance!
@+

12 réponses

vilhjalms Messages postés 591 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 16 juillet 2009 2
25 avril 2007 à 03:35
0
theoscar Messages postés 18 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 5 mars 2009
25 avril 2007 à 09:54
C'est pour ça que j'ai mis ça dans la rubrique PHP 'débutants', c'est parce que j'arrive pas à le mettre en forme correctement sans avoir plein d'erreurs. Google a beau être mon ami, je n'en reste pas moins un gros benet en PHP !

Si tu pouvais m'aider sur ce coup là, après ça j'ai fini mon projet ...

merci d'avance
0
yoadsl Messages postés 120 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 22 mai 2007
26 avril 2007 à 20:48
je te conseillerais de mettre le parcours dans un autre fonction qui prend en entrée le nom du rep de départ et qui renvoie la liste des fichiers images et avant ou après ton preg_match tu utilise la fonction isdirectory ou is_directory je ne sais plus et si ça renvoit vrai ben tu appelle en récursif sur ce sous-répertoire en ajoutant le retour de ta fonction à la liste que tu crée
voilà voilà !
@+
0
theoscar Messages postés 18 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 5 mars 2009
26 avril 2007 à 23:50
oulaaa. Je suis franchement incapable de faire ça moi .....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
27 avril 2007 à 00:24
Salut,

envoi ton code et les messages si t'as plein d'erreurs...

In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
0
theoscar Messages postés 18 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 5 mars 2009
27 avril 2007 à 13:09
Voilà le code, mais j'ai du mal à comprendre .... concernant les messages d'erreur, j'en ai pas, j'ai juste une page blanche.

<?php 
        //On indique le dossier images
    $chem_img = "./galerie/Photos/";
    //On ouvre le dossier images
    $handle  = opendir($chem_img);


      //pour chaque fichier et dossier
   while ($fichier = readdir($handle))
   {
      //on ne traite pas les . et ..
      if(($fichier != '.') && ($fichier != '..'))
      {
         //si c'est un dossier, on le lit
         if (is_dir($handle.'/'.$fichier))
         
                  {
            //Si les fichiers sont des images
            if(preg_match ("!(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$!i", $fichier))
                {
                    $listef[] = $file;
                }
        }
    
    $random_img = rand(0, count($listef)); //permet de prendre une image totalement au hasard (RANDom) parmi toutes les images trouvées.
    
    //On calcule la largeur et la hauteur de l'image aléatoire
    $size = getimagesize($chem_img."/".$listef[$random_img]);
    
    //Largeur maximale de l'image pour la création des miniatures
    $largeur_maxi = 500;
    //Si la largeur dépasse la limite autorisée...
    if ($size[0] > $largeur_maxi)
        {
            //...la nouvelle largeur est égale à la limite à ne pas dépasser
            $width = $largeur_maxi;
            //La largeur d'origine divisée par la largeur limitée (on obtient un chiffre qui sert à faire la même proportion pour la hauteur)
            $theight = ($size[0]/$largeur_maxi);
            //La hauteur originale est divisée par le chiffre obtenu précédemment afin que l'image conserve les mêmes proportions que l'originale (mais en mode vignette)
            $height = ($size[1]/$theight);
        }
    else
        {
            //Sinon on garde la taille originale             $width $size[0]; $height $size[1];
        }
    //On affiche l'image aléatoire (en respectant les standards ! :) )
    echo "";
    //On ferme le dossier
    closedir($handle);
 //fermeture du pointeur
   closedir($pointeur);
?>
0
yoadsl Messages postés 120 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 22 mai 2007
30 avril 2007 à 02:21
Comme j'avais envie de me changer les idées de mon travail je me suis penché sur ton problème et voici la solution, je me suis permis de rajouter dans les dossier exclus ceux nommées miniatures vu ce que tu comptes en faire et le code est ultra-commenté pour que tu puisse comprendre ce que j'ai fait



<?

function parcours($chemin)
{
 //on Crée un tableau vide
 $listef=array();
 
 //On ouvre le répertoire
 $handle  = opendir($chemin);
 
 //On parcoure chaque élément du dossier
 while ($file = readdir($handle))
 {
  //on élimine les dossiers indésirables
  if(($file != '.') && ($file != '..') && ($file != 'miniatures'))
  { 
   //Si les fichiers sont des images
   if(preg_match ("!(\.jpg|\.jpeg|\.gif|\.bmp|\.png)$!i", $file))
   {
    //on les ajoute à la liste
    $listef[] = $chemin."/".$file;
   }
   //si c'est un dossier
   if(is_dir($chemin."/".$file))
   {
    //on appelle la fonction sur ce dossier et ajoute le résultat à la liste existante
    $listef=array_merge($listef,parcours($chemin."/".$file));
   }
  }
 }
 //on fermer le répertoire
 closedir($handle);
 //on renvoie la liste de fichier obtenue
 return($listef);
}


function imagerandom($chemin,$taillemax)
{
//puis on récupère les chemins de toutes les images 
$listef=parcours($chemin);


//permet de prendre une image totalement au hasard (RANDom) parmi toutes les images trouvées.
$random_img = rand(0, count($listef));


//On calcule la largeur et la hauteur de l'image aléatoire
$size = getimagesize($listef[$random_img]);


//Largeur maximale de l'image pour la création des miniatures
$largeur_maxi = $taillemax;
//Si la largeur dépasse la limite autorisée...
if ($size[0] > $largeur_maxi)
{
 //...la nouvelle largeur est égale à la limite à ne pas dépasser
 $width = $largeur_maxi;


 //La largeur d'origine divisée par la largeur limitée (on obtient un chiffre qui sert à faire la même proportion pour la hauteur)
 $theight = ($size[0]/$largeur_maxi);


 //La hauteur originale est divisée par le chiffre obtenu précédemment afin que l'image conserve les mêmes proportions que l'originale (mais en mode vignette)
 $height = ($size[1]/$theight);
}
else
{
 //Sinon on garde la taille originale  $width $size[0]; $height $size[1];
}
//On affiche l'image aléatoire (en respectant les standards ! :) )
echo "";
}


imagerandom("Photos",500);
?>
0
yoadsl Messages postés 120 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 22 mai 2007
30 avril 2007 à 02:27
bon j'ai dû rajouter un espace sans faire exprès lors de mon copier-coller :
dans l'avant-dernière ligne de code :
target=\ "_blank"
il faut mettre
target="_blank"
@++
0
yoadsl Messages postés 120 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 22 mai 2007
30 avril 2007 à 02:32
lol c chiant qu'on puisse pas éditer ses messages !
encore un pour dire que si dans preference.php tu as mis des répertoires cachés n'oublie pas de les rajouter dans la ligne répertoire interdit (.,..,miniatures etc etc) sinon tes photos cachées s'afficheront aléatoirement
@+
0
theoscar Messages postés 18 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 5 mars 2009
30 avril 2007 à 10:21
Merci pour ce super coup de main !! .... mais cela ne fonctionne pas, on dirait qu'il ne va pas chercher les sous dossiers.
Pour info, ce script est sur ma page index et va chercher les images dans les sous-dossiers de la galerie. ça donne :

www -- image_aleatoire.php
         |
         ----galerie
               |
               ---Photos
                     |
                     ---galerie1
                     ---galerie2
                     ---etc.....

la variable "$chemin=......." ne doit pas être renseignée quelque part, au moins pour donner un point de départ? ou alors c'est moi qui fait quelque vhose qui ne va pas.
0
yoadsl Messages postés 120 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 22 mai 2007
30 avril 2007 à 10:30
ben si il faut bien sûr spécifier le chemin :

l'appel de la fonction est de la forme imagerandom($chemin,$taille);
en l'occurence moi je l'appelle avec imagerandom("Photos",500);
donc d'après ce que tu dis tu devrais l'appeler avec imagerandom("galerie/Photos",500);
@+
0
theoscar Messages postés 18 Date d'inscription jeudi 5 mars 2009 Statut Membre Dernière intervention 5 mars 2009
30 avril 2007 à 11:17
super tout fonctionne, en actualisant souvent la page pour tester, de temps en temps il ne trouve pas d'images mais je ne pense pas que cela soit un problème. Soit, j'actualise trop, soit je n'ai pas encore assez d'images dans mes dossiers. Je vais tester ça en conditions réelles.

en tout cas un GRAND merci pour ton aide !

@+
0
Rejoignez-nous