Image aléatoire

Signaler
Messages postés
18
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
5 mars 2009
-
Messages postés
18
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
5 mars 2009
-
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

Messages postés
591
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
16 juillet 2009
2
Messages postés
18
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
5 mars 2009

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
Messages postés
120
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
22 mai 2007

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à !
@+
Messages postés
18
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
5 mars 2009

oulaaa. Je suis franchement incapable de faire ça moi .....
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
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)
Messages postés
18
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
5 mars 2009

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);
?>
Messages postés
120
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
22 mai 2007

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);
?>
Messages postés
120
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
22 mai 2007

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"
@++
Messages postés
120
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
22 mai 2007

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
@+
Messages postés
18
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
5 mars 2009

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.
Messages postés
120
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
22 mai 2007

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);
@+
Messages postés
18
Date d'inscription
jeudi 5 mars 2009
Statut
Membre
Dernière intervention
5 mars 2009

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 !

@+