Page 1 sur 1

Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 16:06
par Chabin971
Bonjour à tous.

J'ai besoin d'aide pour afficher des images aléatoires différentes. Je m'explique:

J'ai un code me permettant de générer des images grâce à d'autres images (Ex : un personnage avec uniquement des yeux bleus + un autre avec uniquement une cravate verte = un personnage avec des yeux bleus ET une cravate verte )

Jusque la, rien de compliqué ^^

Voici mon code :
<?php	
	//1. On classe les images dans des tableaux
		$yeux = array("yeux1.png","yeux2.png","yeux3.png");
		$cravate = array("cravate1.png","cravate2.png","cravate3.png");
		$col = array("col1.png","col2.png","col3.png");
		$tshirt = array("tshirt1.png","tshirt2.png","tshirt3.png");
		
	//2. On choisit une image aléatoire pour chaque tableau
		$yeuxaleat = $yeux[rand(0,2)];
		$cravatealeat = $cravate[rand(0,2)];
		$colaleat = $col[rand(0,2)];
		$tshirtaleat = $tshirt[rand(0,2)];
		
	//3. On fusionne les images 
		header("Content-type: image/png");
        $source = imagecreatefrompng("../img/".$yeuxaleat."");
        $source2 = imagecreatefrompng("../img/".$colaleat."");
        $source3 = imagecreatefrompng("../img/".$tshirtaleat."");
        $destination = imagecreatefrompng("../img/".$cravatealeat."");
        imagecopymerge($destination, $source, 0, 0, 0, 0, 3501, 3491,50);
        imagecopymerge($destination, $source2, 0, 0, 0, 0, 3501, 3491,50);
        imagecopymerge($destination, $source3, 0, 0, 0, 0, 3501, 3491,50);
        imagepng($destination); 
Ce code fonctionne nickel et j'arrive à peu près à obtenir ce que je voulais (à l'exception des couleurs qui sont trop "transparentes" a mon gout)

Ensuite, j'ai une base de donnée simple qui contient uniquement les identifient,nom et prénom de personnes inventées.

Et pour finir, j'ai une page php sur laquelle je recupere les informations de la base de donnée ET les images aléatoires

Voila son code :
<!DOCTYPE html>
<html lang="fr">
<html>

  <head>
    <title>Superpositions d'images</title>
    <meta charset="utf-8"> 
     <link rel="stylesheet" href="design.css">
  </head>
<h2> Voici la liste des personnes :</h2>
  <body>
		<?php
			include ('connexion_base.php');
			$id_connexion = connexion();
			if ($id_connexion->connect_errno ==0) 
			{
				$requete = 'select * from personne';
				$resultat = $id_connexion->query($requete);	
				$nbrepersonnes = $resultat->num_rows;
				echo 'Il y\'a actuellement '.$nbrepersonnes.' personne(s) enregistrées.<br>';
				echo '<table>';	
				echo '<tr><td>Identifiant</td><td>Prénom</td><td>Nom</td><td>Image</td></tr><br>';
				while ($personne = $resultat->fetch_object())
				{
					echo '<tr><td>'.$personne->id_personne.'</td><td>'.$personne->prenom.'</td><td>'.$personne->nom.'</td><td><img src="image.php" /></td></tr>';
				}
				echo '</table>';
			}
		?>
  </body>

</html>

Le problème ? Toutes les images sont identiques ! Elles changent quand on rafraichit la page mais les 2 personnes auront toujours la même image, alors que mon but est que chaque personne ait une image aléatoire. Je ne veux pas qu'une image aléatoire soit créée et utilisée pour tous [voir ci-dessous]
PS : Je ne sais pas si j'ai été clair dans ce dernier paragraphe xD n'hésitez pas à me laisser un message si vous pensez avoir mal compris.
memeimage1.png
memeimage2.png
Merci d'avance pour votre aide :)

Re: Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 16:34
par niuxe
Salut Ubuntero ;)

Je te corrige cette partie là de ton script (car tes expressions font flipper). :

$yeuxaleat = $yeux[mt_rand($yeux)];
                $cravatealeat = $cravate[array_rand($cravate)];
                $colaleat = $col[array_rand($col)];
                $tshirtaleat = $tshirt[array_rand($tshirt)];
Si tu dois utiliser rand autant utiliser mt_rand ;)


Vive la Suse et Ubuntu ;)

Re: Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 16:45
par Chabin971
Salut Ubuntero ;)
$yeuxaleat = $yeux[array_rand($yeux)];
                $cravatealeat = $cravate[array_rand($cravate)];
                $colaleat = $col[array_rand($col)];
                $tshirtaleat = $tshirt[array_rand($tshirt)];
Merci pour cette correction ;) par contre il faut que je mette array_rand pour $yeux sinon ca ne fonctionne pas ^^


Mon problème c'est que (comme on peux le voir sur les 2 images) la même "image de profil" apparait pour les 2 personnes alors qu'il en faut une différente pour chaque. (sans oublier que les images doivent être générées aléatoirement ^^')

Re: Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 16:47
par niuxe
Je viens de comprendre ton souci. Attend je fais un teste de mon côté. J'ai déjà une solution à ton souci. Mais pour le moment, je vais essayer autrement. Car la solution que j'ai est contraignante.

Re: Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 17:14
par niuxe
Je viens de lire ton code et fait des tests. Pourtant la logique du code est bonne. Je pense que le souci vient du cache browser (même occurrence). En fait j'ai deux solutions. Il va falloir un peu de dev. supplémentaire.

Soit tu copies le fichier autant de fois que nécessaire avec un nom différent du fichier matrice. image-1, image-2, etc.

Soit tu injectes les caractéristiques de chaque user dans l'image via une ou plusieurs class entres elles

Re: Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 17:21
par telnes
hello

ou monimage.php?value...

Re: Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 17:26
par Chabin971
Je viens de lire ton code et fait des tests. Pourtant la logique du code est bonne. Je pense que le souci vient du cache browser (même occurrence). En fait j'ai deux solutions. Il va falloir un peu de dev. supplémentaire.

Soit tu copies le fichier autant de fois que nécessaire avec un nom différent du fichier matrice. image-1, image-2, etc.

Soit tu injectes les caractéristiques de chaque user dans l'image via une ou plusieurs class entres elles
J'aurais bien pris la 1ère mais en prochaine étape de mon projet, je pensais faire un formulaire d'inscription du coup je ne sais pas combien de personnes seraient enregistrées dans la base de donnée ^^'

Par contre la 2nde je ne voit pas du tout comment faire est-ce que tu pourrais m'expliquer stp :priere:

Re: Besoin d'aide : Afficher des images différentes

Posté : 21 mai 2014, 20:11
par niuxe
Je viens de t'écrire cette class. J'ai fait ça de tête. Donc il se peut qu'il y ait des erreurs. Cependant le but est de t'indiquer la marche à suivre.

Mon idée :

En amont tu parses les dossiers contenant tes images (img/yeux, img/cravate, etc.). Le mieux est de le faire récursivement. if(is_dir())... else ... Ainsi tu restes dynamique jusqu'au bout. Demain, tu rajouteras une perruque, des bijoux, etc. (voir mon commentaire plus bas)

Une fois que tu as parsé les dossiers, tu dois récupérer un beau array avec comme clef le nom du dossier et comme valeur la liste de tes images.
array(
'yeux' => array("1.png","2.png","3.png"),
'col' => array("1.png","2.png","3.png"),
;
A ce moment là tu crées une nouvelle occurrence Avatar. Tu assignes à la propriété caractéristique les clef et la valeur aléatoire. et tu affiches ton image.

Si ça ne fonctionne pas, tu n'auras pas bosser pour rien. Tu crées dynamiquement un nouveau fichier avec les propriété injecter dans Avatar. Bien sûr, il faudra appeler le fichier créé dynamiquement.
avatar-1.png, avatar-2.png
<?php
	class Avatar{
		private $caracteristique = array(
			'yeux' => 0,
			'cravate' => 0,
			'col' => 0,
			'tshirt' => 0,
		);

		public function display($chemin){
			header("Content-type: image/png");
			$imageSource = array();
			$nbCaracteristiques = count($this->proprietes);
			foreach ($this->proprietes as $key => $value) {
				$imageSource[$k] => imagecreatefrompng($chemin.'/'.$k.'/'.$v.".png"); //../img/yeux/1.png ou ../img/col/3.png etc.
				//améliorer dans le cas où un dossier ($k) est manquant (Exception) ou que le fichier n'existe pas (Exception);
			}
			for ($i=0; $i < $nbCaracteristiques - 1; $i++) { //s'arrête avant
				imagecopymerge($this->proprietes[$nbCaracteristiques - 1], $imageSource[$i], 0, 0, 0, 0, 3501, 3491,50); //ces valeurs ne doivent pas être en dur. A toi d'améliorer
			}
	        imagepng($this->proprietes[$nbCaracteristiques - 1]); 


		}
		public function __get($proprietes){
			//à toi d'améliorer
			if (is_null($this->$proprietes)) {
				throw new Exception("Cet attribut $proprietes n'existe pas dans la class ".__CLASS__);
				
			}
			
			return $this->$proprietes;
		}


		public function __set($proprietes,$value){
			//à toi d'améliorer
			if (is_null($this->$proprietes)) {
				throw new Exception("Cet attribut $proprietes n'existe pas dans la class ".__CLASS__);				
			}

			$this->$proprietes = $value;


		}

	}
Le souci avec la class que je t'écrite, il y a les caractéristique en dur (yeux, cravate, col). Or demain, tu voudras récupérer cette class pour un autre style d'avatar (tete, chapeau, bijoux). Il faudrait que tu lies la class avec au moins une autre class. (une class file) celle ci s'occupera de parser le nombre de dossiers qu'il y aura dans img/avatar/. Ce qui veut dire qu'à terme, l'attribut
private $caracteristique = array(
			'yeux' => 0,
			'cravate' => 0,
			'col' => 0,
			'tshirt' => 0,
		);
sera remplacer par ceci (les clefs seront dynamiques) :
private $caracteristique = array();
Ce qui veut dire qu'il y aura forcément une methode __construct avec une occurrence file et que celle ci soit une propriété d'Avatar.

Re: Besoin d'aide : Afficher des images différentes

Posté : 22 mai 2014, 09:08
par Chabin971
Je vois ce que tu veux dire :) L'idée est pas mal mais je t'avouerais que je n'ai pas encore le niveau x)
Le php ça va mais le C j'ai beaucoup de mal ^^'

En tout cas merci quand même :D

PS : pour ceux qui veulent en savoir plus, mon projet est disponible ici : http://forge.info.univ-angers.fr/~gh/Pr ... TS2014.php

Re: Besoin d'aide : Afficher des images différentes

Posté : 22 mai 2014, 13:11
par xTG
Le php ça va mais le C j'ai beaucoup de mal ^^'
Il n'y a pas une seule ligne de C dans tout le topic. ;)
Ce qu'il t'a posté est bien du PHP, mais du PHP orienté objet.

Re: Besoin d'aide : Afficher des images différentes

Posté : 23 mai 2014, 11:53
par Chabin971
C'est bon j'ai résolu mon problème :D

En fait il fallait juste que je donne une valeur aléatoire à image.php lorsque je l'appelle dans l'index.php sinon le cache du navigateur pense que c'est la même image qui est demandée.
$n=rand();
echo '<tr><td><img src="image.php?q='.$n.'" /></td></tr>';
Merci pour votre aide :)