IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Répertoire et sous-répertoire


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Répertoire et sous-répertoire
    bonjour bonjour,

    voilà je vous dis où j'en suis et ensuite vous explique le problème ce que je souhaite faire.
    J'ai un dossier qui contient lui-même des dossiers numéroter de 1 à 200 par exemple.
    J'ai créer un script pour réduire les images contenu dans un dossier (images) et les affiche, mais sur un seul dossier, maintenant je voudrais que ce script puisse réduire les images contenu dans chaque dossier numéroté.
    La construction est images /
    dossier1 photo1,photo2
    dossier2 photo2-1,2-2 etc....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    $gf = "images/";
    $pf = "petite_images/";
    $max = 250;
     
    // tester si le dossier de destination existe, sinon le créer
    if (!is_dir($pf)) {
    	mkdir($pf);
    }
     
     
     
    // lister les images du dossier grand_format
    $liste = glob("${gf}*jpg"); // => "${gf}*jpg" -> "images/*jpg"
    // $liste = array('images/un.jpg','images/deux.jpg','images/trois.jpg','images/quatre.jpg');
     
     
     
    $imgs = array();
    // pour chaque image du dossier grand_format
    foreach ($liste as $imageG) {
    	$fichier = basename($imageG); // "images/un.jpg" => "un.jpg"
    	if (!is_file("${pf}${fichier}")) { // "imagesDesti/un.jpg"
    	// créer une copie de l'image dans le dossier petit_format
    	reduire($fichier,$gf,$pf,$max);
    	}
    	$imgs[] = "<img src='${pf}${fichier}' />";
    	}
    	$imgs = join($imgs,"<br/>\n");
     
    // On envoie le HTML
    header("content-type:text/html; charset=utf-8");
    echo "<html><head><title>réduction</title></head><body>\n$imgs\n</body></html>";
     
     
    // enregistre dans $d_dest le $fichier de $d_src réduit au max à $max
    function reduire($fichier, $d_src, $d_dest, $max) {
    	// Crée une nouvelle image à partir d'un fichier src
    	$grande_image = imagecreatefromjpeg("${d_src}${fichier}");
     
    	// prend les mesures de l'image src
    	$ls = imagesx($grande_image);
    	$hs = imagesy($grande_image);
     
    	//On établi une regle de traitement --- si largeur src>hauteur de la source alors
    	if ($ls > $hs) {
    		$ld = $max;
    		$hd = $hs / $ls * $max;
    	} else {
    		$hd = $max;
    		$ld = $ls / $hs * $max;
    		}
     
    /*Retourne un identifiant de ressource image en cas de succès, FALSE si une erreur survient.en gardant les vrai couleur*/ 
    		$petite_image = imagecreatetruecolor($ld,$hd);
    		imagecopyresampled($petite_image, $grande_image, 0, 0, 0, 0, $ld, $hd, $ls, $hs);
    		/* Enregistre l'image_gd $petite_image dans le fichier "$d_dest$fichier" */
    		imagejpeg($petite_image, $d_dest.$fichier);
     
    	}

    donc jusque ici il me prend les images contenu dans le dossier et en fait des miniatures.
    Ce que je cherche donc à faire c'est que le code permette d'ouvrir chaque sous dossiers et créer des miniatures en conséquence.

    J'ai entendu parler de chaine récursive dois je me pencher sur ce sujet ?
    A et en plus je veux qu'il conserve le numéro du dossier contenant les images
    exemple dossier1 contient images1-1.jpj,1-2.jpg,
    le dossier 2 contient images2-1.jpg, 2-2;jpg

    voilà

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    Oui, il faut créer une fonction récursive.

    Pseudo-code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fonction RedimensionnerImagesRépertoire(répertoire)
        PourChaque entrée de répertoire
            Si EstImage(répertoire + entrée) Alors
                RedimensionnerImage(répertoire + entrée)
            SinonSi EstRépertoire(répertoire + entrée) Alors
                // Récursion sur le sous-répertoire
                RedimensionnerImagesRépertoire(répertoire + entrée)
            FinSi
        FinPourChaque
    FinFonction

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    merci séb, ça confirme ce que je pensais.
    Je vais me servir de ton pseudo-code pour exemple car je ne connais pas du tout la récursivité.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    Si tu as un souci n'hésite pas à poster à la suite de ce thread !
    Bon dév

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    j'ai essayé de reprendre ton pseudo code mais je me pose la question maintenant de où la placer ?
    voilà ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?php 
    	function redimImageRepertoire($gf){
    		//pour chaque image du dossier
    		foreach ($liste as imageG){
    			//basename — Sépare le nom du fichier et le nom du dossier
    			$fichier = basename($imageG); // "images/un.jpg" => "un.jpg"
    				if (is_file("${gf}${fichier}"){
    				reduire($fichier, $d_src, $d_dest, $max);
    				}
    				//is_dir — Indique si le fichier est un dossier
    				elseif {is_dir(".");
    				}
    		}
    	}
    ?>
    Si je comprend bien il faudrait que cette boucle prenne la place de l'autre dans le code d'origine ou insérer la boucle foreach dans le foreach du script d'origine.
    Là j'ai le cerveau qui sature, je sais qu'il manque quelque chose à la suite du elseif {is_dir(".") // la je met sur le point d'entrée du dossier mais ça me plait pas il doit manquer quelque chose

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    Je ne pense pas que ton script ait une syntaxe valide, notamment le elseif.
    De plus ta fonction n'est pas autonome. Que vaut $liste ? Comment fais-tu pour récupérer les entrées d'un répertoire ? (dans mon pseudo-code c'est sous-entendu par PourChaque entrée de répertoire)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 26
    Points : 13
    Points
    13
    Par défaut c'est résolu
    violà comme l'indique l'intituler c'est résolu, je ne sais pas comment le marquer directement résolu sur le site comme je le vois pour certain.

    Je mets mon code, bien sur il doit pouvoir être optimiser.
    Je le mets au cas ou quelqu'un d'autre aurait le même type de problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    <?php
    	//Vérifie si un fichier ou un dossier existe)
    //phpinfo();
    $racine = "images";
    $dossier_reduit = "petite_images";
    $max = 250;
     
    lit_dossier($racine);
     
     
    function lit_dossier($dir) {
    	global $dossier_reduit;
    	if (!is_dir($dir)) {
    		echo "$dir n'est pas un dossier";
    		return;
    	}
    	//Ouvre le dossierPrincipale et renvoi un tableau 
    	$liste = scandir($dir);
    	foreach ($liste as $d) {
    		if ($d!="." && $d!=".." && $d!=$dossier_reduit && is_dir($dir."/".$d)) {
    			echo "$dir/$d est un dossier<br/>\n";
    			echo"$d<br>\n"; // pour recuperer le n° de dossier images
    			lit_dossier($dir."/".$d);
    		} else { 
    			//echo "$dir/$d est un fichier ou . ou ..<br/>\n";
    		}
    	}
    	traiter_dossier($dir);
    }
     
    function traiter_dossier($gf) {
    	global $dossier_reduit, $max;
    	$gf .= "/";
    	$pf = $gf.$dossier_reduit."/";
     
    	// tester si le dossier de destination existe, sinon le créer
    	if (!is_dir($pf)) {
    		mkdir($pf);
    	}
     
    	// lister les images du dossier grand_format
    	$liste = glob($gf."*{jpg,gif,png,jpeg}",GLOB_BRACE); // => "${gf}*jpg" -> "images/*jpg"
    	// $liste = array('images/un.jpg','images/deux.jpg','images/trois.jpg','images/quatre.jpg');
    	$imgs = array();
    	// pour chaque image du dossier grand_format
    	foreach ($liste as $imageG) {
    		$fichier = basename($imageG); // "images/un.jpg" => "un.jpg"
    		echo "- ${pf}${fichier}<br/>\n";
    		// si pas jpg alors renommer en jpg sinon ne rien ajouter
    		if (!is_file("${pf}${fichier}")) { // "imagesDesti/un.jpg"
    			// créer une copie de l'image dans le dossier petit_format
    			reduire($fichier,$gf,$pf,$max);
    			echo "j'ai du réduire<br/>\n";
    		}
    	}
    }
     
     
    function reduire($fichier, $d_src, $d_dest, $max) {
    	// Crée une nouvelle image à partir d'un fichier src
    	$ext = trouver_extension($fichier);
    	switch($ext) {
    		case "jpg":
    		case "jpeg":
    			$f = "imagecreatefromjpeg";
    			$fe = "imagejpeg";
    		break;
    		case "gif":
    			$f = "imagecreatefromgif";
    			$fe = "imagegif";
    		break;
    		case "png":
    			$f = "imagecreatefrompng";
    			$fe = "imagepng";
    		break;
    		default:
    			return;
    	}
    	$grande_image = $f("${d_src}${fichier}");
     
    	// prend les mesures de l'image src
    	$ls = imagesx($grande_image);
    	$hs = imagesy($grande_image);
     
    	//	On établi une regle de traitement --- si largeur src>hauteur de la source alors
    	if ($ls > $hs) {
    		$ld = $max;
    		$hd = $hs / $ls * $max;
    	} else {
    		$hd = $max;
    		$ld = $ls / $hs * $max;
    	}
     
    	/*Retourne un identifiant de ressource image en cas de succès, FALSE si une erreur
    	  survient.en gardant les vrai couleur*/ 
    	$petite_image = imagecreatetruecolor($ld,$hd);
    	imagecopyresampled($petite_image, $grande_image, 0, 0, 0, 0, $ld, $hd, $ls, $hs);
    	/* Enregistre l'image_gd $petite_image dans le fichier "$d_dest$fichier" */
    	$fe($petite_image, $d_dest.$fichier);
    }
     
    function trouver_extension($fichier){
     
    	$ext = explode(".",$fichier);
    	// Pour vérifier push, pop sert a enlever le dernier element du tableau (voir shift et unshift)
    	$extension = array_pop($ext);
    	return $extension;
    }
     
    ?>

    merci pour vos réponses c'est vraiment sympa.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Pagination de sous répertoire d'un répertoire
    Par tchoukapi dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/08/2006, 15h59
  2. Réponses: 6
    Dernier message: 23/06/2006, 13h28
  3. Lecture des répertoires et sous répertoire en php
    Par BRAUKRIS dans le forum Langage
    Réponses: 1
    Dernier message: 30/03/2006, 17h27
  4. Comment récupérer les sous répertoires d'un répertoire
    Par charliejo dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/02/2006, 08h47
  5. [VB6] Suppression d'un répertoire et sous répertoire
    Par Tsien dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/01/2006, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo