déterminer l'extension d'une photo

Eléphanteau du PHP | 30 Messages

12 mai 2009, 11:45

bonjour a tous,

voilà j'ai fait un petit script pour faire un redimensionnement d'image qui fonctionne bien seulement il ne traite pour l'instant que les images au format jpg et je souhaiterais qu'il puisse traiter du png et du gif
je vous mets déjà mon code
<?php

$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"
//	$echo $ext;

	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>";
// FINI

// 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);
	echo  $ext; 
}

?>

Voilà donc le code qui fonctionne parfaitement mais uniquement si l'image est en jpg
j'ai lu qu'il existait PATHINFO_EXTENSION
mais comment m'en servir ?

$exts = (pathinfo($liste, PATHINFO_EXTENSION));
devrait me renvoyer un tableau dans $exts si je comprends bien le tableau $liste non ?
comment je peut me servir de ça pour gérer toutes les extension.
$exts=(".",$liste), mais cela ne donne rien
suis-je sur le bon chemin ?
Un coup de pouce serais le bien venu
J'image aussi qu'il faudra un traitement spécial pour chaque type de fichier png; gif du type :
imagecreatefromjpeg

voilà mon problème. Pas sorcier j'imagine pour les programmeur non débutant mais difficile pour moi

Eléphant du PHP | 250 Messages

12 mai 2009, 12:08

Bonjour
Je n'en suis pas certain mais il me semble que la fonction getImageSize te donnera les infos nécessaire
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Eléphanteau du PHP | 30 Messages

12 mai 2009, 12:20

je viens de regarder sur http://fr.php.net/manual/fr/function.getimagesize.php
apparement cela sert a renvoyer la taille de l'image mais ne permets pas d'obtenir son extension

ViPHP
ViPHP | 1136 Messages

12 mai 2009, 12:32

Slt ,

pathinfo() prend en paramètre , un string qui correspond au path du fichier que tu veux étudier ( ou simplement le nom du fichier ) , et en option , une constante qui définie ce que la fonction doit retourner .

Dans le code que tu nous montre , à la place d'un string , tu lui passe un tableau .. ( ça ne fonctionne pas )

Tu dois donc plutot faire quelque chose du genre :

$exts = pathinfo($fichier, PATHINFO_EXTENSION); 

//affiche l'extention 
echo $exts['extension'];
Voilà , il faut que tu gardes en tête que l'extension d'un fichier ne t'assure en rien qu'il soit valide .
ce n'est pas parce que mon fichier se nomme toto.png , que c'est forcement une image ...

Ch.

Eléphanteau du PHP | 30 Messages

12 mai 2009, 12:45

merci je viens effectivement de me rendre compte que je lui envoyer un tableau j'ai rajouter ces lignes:
 
foreach ($liste as $gf=>$image){
$ext = explode(".",$image);
echo $ext[1];
et effectivement il me renvoi une ligne de jpg autant que j'ai de photo dedans. Donc il me renvoi bien un tableau.

je ne sais pas comment essayé ton code
$exts = pathinfo($fichier, PATHINFO_EXTENSION); 

//affiche l'extention 
echo $exts['extension'];
,
il ne m'affiche rien faut dire que je n'ai pas remplacer $files par autre chose peut-être par $image dans le cas ou je garde la partie de code que j'ai rajouté.

Si je comprends bien il faudrait déjà que je test si c'est un format image type png, jpg, gif, ...

ViPHP
ViPHP | 1136 Messages

12 mai 2009, 12:52

Et bien , tu remplace $fichier , par le nom de ta variable qui contient le nom de l'image courante .
:)
Ch.

Eléphanteau du PHP | 30 Messages

12 mai 2009, 13:03

toutes les images courante sont dans un tableau
$liste = glob("${gf}*jpg");// => "${gf}*jpg" -> "images/*jpg"
j'ai essayé de remplacer $fichier par $gf , qui si je comprends bien est une images courante du tableau, j'ai mais il ne me sort que l'ensemble des photo a l'affichage sans me donner son extension

Je reviens dès que j'ai pris un peu plus de recul sur le problème.
Merci

Eléphanteau du PHP | 30 Messages

13 mai 2009, 12:28

j'ai finalement choisi de faire un explode pour retenir l'extension.

Une autre petite question si je peux me permettre de la mettre à la suite ou voudrais mieux faire une autre discussion.

Voilà mon répertoire contenant les images est en vrai du type
images/dossier1
images dossier 2
etc ...
Comment faire pour que la fonction s'applique à chaque chaque sous répertoire et non plus a toutes les images contenu dans le répertoire images.
C'est clair ?
images contient plein de sous répertoire contenant eux-même des images.
dois-utiliser une variables qui me permet de passer de dossier en dossier et si oui ou la mettre dans la boucle de traitement, ou refaire une autre boucle avec cette variables ?

Eléphanteau du PHP | 30 Messages

16 mai 2009, 21:43

c'est résolu je ne sais pas comment le signaler.
je laisse le code pour d'autre qui aurait le même type de problème, je pense que l'on peut l'améliorer mais il fonctionne.
Il a fallut que je fasse une boucle récursive type de boucle que je ne connaissait pas:
<?php

$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";
			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;
}

?>	   
Voilà en espérant que cela en aidera d'autre.
Merci pour votre aide et votre contribution.