8791 sujets

Développement web côté serveur, CMS

bonjour tout le monde

j'ai un petit souci avec un boucle lors du redimensionnement d'image, je m'explique, je possède un répertoire ou son contenu une serie d'image et j'utilise GD pour faire des miniatures, mon souci est que la boucle n'affiche qu'une seule image, voici mon code


function resize_img($file)
{
  /* on créé l'image en couleurs vraie avec la largeur et hauteur */
  $image = imagecreatetruecolor(50,50);
  
  $img = imagecreatefromjpeg($file);
  $imgx = imagesx($img);
  $imgy = imagesy($img);
  imagecopyresampled($image, $img, 0, 0, 0, 0, 50, 50, $imgx, $imgy);       
  header("Content-type: image/png");        
  return imagepng($image);
  imagedestroy($image);
  imagedestroy($img);
}

// on définit le répertoire ou ce trouve les images
$folders = "images/real/";
// on ouvre le répertoire
$rep=opendir($folders);
// on fait une boucle sur chaque élément du répertoire
while($file=readdir($rep))
{
     if($file != "." && $file != "..")
     {
         $files = explode(".",$file);
         if($files[1] == "jpg" || $files[1] == "jpeg" || $files[1] == "JPG" || $files[1] == "JPEG")
         {
             $image = resize_img($folders.$file);
             echo $image . "<br>";  
         }

     }
}
closedir($rep);


je ne comprend pas pourquoi il ne m'affiche que la première images, d'avance merci de votre aide
splifferwolf
Modifié par splifferwolf (14 Dec 2007 - 13:00)
Bonjour,

ton code ne peut pas marcher, c'est déjà surprenant qu'il affiche même la première image.
Ce que tu fais ici est techniquement impossible. En effet imagepng() retourne une image destinée à être un fichier à part entière, on ne peut pas en afficher plusieurs dans le même et encore moins y mélanger du html.
Il faut utiliser une balise <img /> classique qui pointe sur un script php qui lui n'affichera QU'UNE image et se terminera.


Quelques remarques diverses:
-Utiliser un système de cache des miniatures générées est fortement conseillé.
-La syntaxe correcte pour lire un dossier est
while(($file=readdir($rep)) !== false)

readir pouvant retourner un résultat non-booléen équivalent à false (0 par exemple).
C'est normal est la raison est que ça n'est pas possible.

En faisant ce que tu fait ton script renvoie des données bianires au navigateur qui correspondent à ton image. En gros quand tu appelle ton script le navigateur comprend que c'est une image. Or un fichier image ne contient qu'une image... je sais pas si je suis clair.

Si tu veux afficher plusieurs images su rla meme page, il faut que tu enregistres les images dans des fichiers (voir la fonction imagepng, que tu utilises deja mais avec un parametre en plus) et que tu génères les balises img, en html qui pointent vers les images.

Ou alors tu crée un autre fichier qui génère des balises img et qui pointent vers ton fichier php avec un paramètre en GET pour dire quel image tu vas redimensionner. genre :

<img src="resize.php?image=rep/image.jpg"/>


Il faut bien comprendre que ce que retourne un fichier php dépend du Content-type. Par défaut il renvoie du html si non précisé, mais tu peux très bien générer en appelant un fichier php une image, du CSS, du PDF, du flash, des documents word... bref ce que tu veux.
tout d'abord merci pour vos réponse

si j'ai bien compris la GD ne peux afficher qu'une seule image, pour afficher les miniature, je devrais générer les image avec imagepng($image,répertoire_de_destination_des_miniatures );

c'est bien ca ?
donc autant utiliser la balise img avec un width et un height à la taille voulue directement depuis les images taille réelle plutot que de redimensionner et créer un new répertoire avec les miniatures, car si j'ai 200 images ca va desuite augmenter l'epace disponible avec ces miniature et risque de dépasser mes limite d'hébergement non ?

vous en pensez quoi ?
splifferwolf a écrit :
tout d'abord merci pour vos réponse

si j'ai bien compris la GD ne peux afficher qu'une seule image, pour afficher les miniature, je devrais générer les image avec imagepng($image,répertoire_de_destination_des_miniatures );

c'est bien ca ?


Non pas forcément... comme je te l'ai dit comme ton script génère une image tu peux l'appeler à partir de la balise img, en lui passant en paramètre l'image à redimensionner (et éventuellement hauteur et largeur, afin d'avoir un script très générique).

splifferwolf a écrit :

donc autant utiliser la balise img avec un width et un height à la taille voulue directement depuis les images taille réelle plutot que de redimensionner et créer un new répertoire avec les miniatures, car si j'ai 200 images ca va desuite augmenter l'epace disponible avec ces miniature et risque de dépasser mes limite d'hébergement non ?

vous en pensez quoi ?


Non car le principe est de réduire également la taille de l'image chargée par le navigateur et donc le temps de chargement de la page et des miniatures. La meilleure solution est à mon avis de ne pas enregistrer les fichiers et d'appeler le script avec la balise img. En plus le redimensionnement par GD risque d'etre quand meme plus propre que le redimensionnement par le navigateur...
splifferwolf a écrit :
si j'ai bien compris la GD ne peux afficher qu'une seule image, pour afficher les miniature, je devrais générer les image avec imagepng($image,répertoire_de_destination_des_miniatures );

Pas forcément mais c'est une option qui marche. Attention à ne pas régénérer les fichier a chaque affichage de la page, ce serait une perte de temps et de performance.


splifferwolf a écrit :
donc autant utiliser la balise img avec un width et un height à la taille voulue directement depuis les images taille réelle plutot que de redimensionner et créer un new répertoire avec les miniatures, car si j'ai 200 images ca va desuite augmenter l'epace disponible avec ces miniature et risque de dépasser mes limite d'hébergement non ?

Une miniature de 50x50 en png doit peser quelque chose approchant les 5ko. En multipliant par 200 on arrive à 1mo. Si tu as la place pour héberger les 200 image en pleine résolution je penses pas que ça soit un problème.

Maintenant regardons l'utilisation d'une image redimensionnée. Le navigateur va devoir télécharger la version résolution pleine puis ensuite la redimensionner, et ce pour chaque visiteur.
Si l'on reprends le chiffre de 200 images, en admettant une qualité photo correcte on a des images de 700ko. Soit un total de 140mo à télécharger puis à redimensionner pour chaque visiteur.
En conséquence, non seulement le chargement sera inutilement lent, mais en plus cela provoquera la mise en cache d'une quantité énorme de donnée. J'ajouterai que si ton hébergement est limité sur le transfert, par exemple 1go/mois avec 7 visiteurs ce quota est atteint.

Vouala ce que j'en pense Smiley murf



grilled Smiley biggol
Modifié par Necromantik (14 Dec 2007 - 12:39)
oki merci pour ces eclaircicement qui sont quand même important et conséquent.

j'ai donc suivi la méthode de skywalk3r

mon fichier resize.php contient

$image = imagecreatetruecolor(50,50); 
$img = imagecreatefromjpeg($_GET['file']);
$imgx = imagesx($img);
$imgy = imagesy($img);
imagecopyresampled($image, $img, 0, 0, 0, 0, 50, 50, $imgx, $imgy);       
header("Content-type: image/png");        
imagepng($image);

et mon fichier index.php

// on définit le répertoire ou ce trouve les images
$folders = "images/real/";
// on ouvre le répertoire
$rep=opendir($folders);
// on fait une boucle sur chaque élément du répertoire
while($file=readdir($rep))
{
     if($file != "." && $file != "..")
     {
         $files = explode(".",$file);
         if($files[1] == "jpg" || $files[1] == "jpeg" || $files[1] == "JPG" || $files[1] == "JPEG")
         {
             echo "<img src=\"resize.php?file=" . $folders.$files . "\" />";
         }

     }
}
closedir($rep);


là éffectivement plusieur image l'une à la suite de l'autre, mais il affiche des images eronées ( comme si il trouvait pas l'image mais avec les bonne dimension )
splifferwolf a écrit :
arrrfff autant pour moi une erreur avec $files au lieu de $file
là ca marche nikel merci beaucoup pour votre aide

Ton problème est donc [Résolu] ? Smiley murf