Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images > Imagick
Imagick Forum d'entraide pour l'extension Imagick permettant de manipuler des images en PHP (port de l'API ImageMagick).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/03/2006, 19h01   #1
Rédacteur
 
Avatar de loka
 
Homme Romain PERRUCHON
Architecte - Expert Technique
Inscription : novembre 2004
Messages : 2 664
Détails du profil
Informations personnelles :
Nom : Homme Romain PERRUCHON
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Architecte - Expert Technique
Secteur : Service public

Informations forums :
Inscription : novembre 2004
Messages : 2 664
Points : 3 607
Points : 3 607
Par défaut [ImageMagick] Création d'un aperçu de carte

Bonjour,

Je developpe actuellement un petit jeu en php et je suis tombé sur un probleme que je n'arrive pas à resoudre (que j'ai par la suite contourné mais qui me laisse perplexe).

Je veux creer une image qui sera un aperçu de la carte de jeu (avec pour chaque terrain une couleur associé, les terrain et la carte etant dans la bdd).

seulement voila, la creation de l'image se fait correctement... jusqu'a x=3 :s
ensuite il remplit la suite de l'image par la couleur du dernier pixel qu'il a placé (il ne rentre plus jamais dans mon switch !)

voici le code :

Code :
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
<?php
header("Content-type: image/png");//on va commencer par declarer que l'on veut creer une image
 
//ensuite on defini la taille de l'image
$image_carte = imagecreate(303,303)   or die ("Cannot Initialize new GD image stream");
 
//maintenant on donne une couleur a notre image (ici un fond blanc)
$fond_carte=Imagecolorallocate($image_carte, 255, 255, 255);
 
require_once "../fonctions.php";
db_connexion();
 
// je vais chercher les terrains dans ma table
$sql = "SELECT x_carte, y_carte, fond_carte FROM carte";
$res = exec_requete($sql);
while ($t = mysql_fetch_assoc($res)){
   $x = $t["x_carte"];
   $y = $t["y_carte"];
   $fond_carte = explode(".",$t["fond_carte"]); // terrain de la forme "1.gif"
   $fond = $fond_carte[0]; // recuperation du num du terrain
 
      switch($fond){
         case "1" :
            $color = Imagecolorallocate($image_carte, 129, 156, 84);
            break;
         case "2" :
            $color = Imagecolorallocate($image_carte, 96, 110, 70);
            break;
         case "3" :
            $color = Imagecolorallocate($image_carte, 134, 118, 89);
            break;
         case "4" :
            $color = Imagecolorallocate($image_carte, 215, 197, 101);
            break;
         case "5" :
            $color = Imagecolorallocate($image_carte, 232, 248, 248);
            break;
         case "6" :
            $color = Imagecolorallocate($image_carte, 169, 177, 166);
            break;
         case "7" :
            $color = Imagecolorallocate($image_carte, 60, 86, 33);
            break;
         case "8" :
            $color = Imagecolorallocate($image_carte, 92, 191, 207);
            break;
         case "9" :
            $color = Imagecolorallocate($image_carte, 39, 141, 227);
            break;
      }
      imagefilledrectangle ($image_carte, (($x*3)-1), (((300-($y*3))-1)), (($x*3)+1), (((300-($y*3))+1)), $color);
}
// on affiche l'image
imagepng($image_carte, "carte.png");
ImageDestroy ($image_carte);
header("Location: afficher_carte.php");
?>
voici l'image que j'obtient :



or il y a des terrain sur la droite qui n'apparraissent pas...

pour vous donner un aperçu de la carte réélle en bas a gauche :



voila, si quelqu'un sais pourquoi ça ne fontionne pas, merci a lui de pouvoir m'eclairer
loka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 00h50   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Je crois comprendre que, à cet endroit :
Code :
1
2
   $fond_carte = explode(".",$t["fond_carte"]); // terrain de la forme "1.gif"
   $fond = $fond_carte[0]; // recuperation du num du terrain
Tu souhaites extraire une variable numérique d'une chaîne. Il me semble que la fonction sscanf() est justement très utile pour cela. Cela te permettrait ensuite de faire les case de ton switch sur des valeurs entières, ce qui est plus rapide à exécuter qu'avec des chaînes de caractères (surtout entre guillemets doubles).

Concernant plus directement ton problème, j'ai l'impression que ton switch a besoin d'avoir un nom d'image du style chiffre.ext dans la BDD : si l'image n'est pas renseignée ou s'il y a plusieurs points ou si ce qui se trouve avant le point n'est pas un chiffre, alors le switch foire.

[Edit] Si cela avait été moi, j'aurais donné des noms corrects à mes images, j'aurais fait une table `image` pour leur donner à chacune un identifiant numérique et j'aurais utilisé cet identifiant dans la table que tu utilises actuellement. Cela aurait au moins deux avantages : les images auraient un nom compréhensible et tu aurais directement un identifiant numérique à exploiter (besoin ni de split ni de sscanf).
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 09h42   #3
Rédacteur
 
Avatar de loka
 
Homme Romain PERRUCHON
Architecte - Expert Technique
Inscription : novembre 2004
Messages : 2 664
Détails du profil
Informations personnelles :
Nom : Homme Romain PERRUCHON
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Architecte - Expert Technique
Secteur : Service public

Informations forums :
Inscription : novembre 2004
Messages : 2 664
Points : 3 607
Points : 3 607
merci de ta reponse, je pense que je vais déjà rajouter une table terrain afin d'avoir un identifiant numerique pour mes terrains et refaire a partir de ça.

cependant dans ma bdd (la table carte), chaque case possede un terrain (de la forme "num.gif") donc je recupere un chiffre a chaque fois, c'est pour ça que je comprend pas trop pourquoi le switch foire :s
loka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 09h57   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Ajoute ceci à la suite de tes case :
Ainsi, nous serons fixés ^^

[Edit] Pense à appeler header() deux lignes plus haut afin d'éviter d'éventuels warnings.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 13h36   #5
Rédacteur
 
Avatar de loka
 
Homme Romain PERRUCHON
Architecte - Expert Technique
Inscription : novembre 2004
Messages : 2 664
Détails du profil
Informations personnelles :
Nom : Homme Romain PERRUCHON
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Architecte - Expert Technique
Secteur : Service public

Informations forums :
Inscription : novembre 2004
Messages : 2 664
Points : 3 607
Points : 3 607
en fait j'avais déjà ajouté le default de cette façon :

Code :
1
2
3
default:
     $color = Imagecolorallocate($image_carte, 0, 0, 0); //noir
     break;
c'est ainsi en voyant qu'il ne passait même pas dans le default, que j'en est deduis qu'il ne passait plus du tout dans le switch.

je fais quelques changements/tests ce soir, je t'en dirais plus par rapport a ce que tu m'as donné
loka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 13h40   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Ahhh, s'il rentre dans le while, alors il rentre forcément dans le switch. Si tu as un case default, alors il fait forcément quelque chose.
Dans ton cas, je me dis que peut-être il ne rentre pas dans le while aussi souvent que tu le crois :/
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 13h57   #7
Rédacteur
 
Avatar de loka
 
Homme Romain PERRUCHON
Architecte - Expert Technique
Inscription : novembre 2004
Messages : 2 664
Détails du profil
Informations personnelles :
Nom : Homme Romain PERRUCHON
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Architecte - Expert Technique
Secteur : Service public

Informations forums :
Inscription : novembre 2004
Messages : 2 664
Points : 3 607
Points : 3 607
oui pour le switch c'est ce que je m'etais dis ^^
mais logiquement il rentre tout le temp dans le while aussi... c'est pour ça que je comprend pas
Sil ne rentre plus dans le while cela voudrais dire que ma requete ne donne pas tout les resultats, or il continu de se deplacer sur l'image ($x et $y) pour placer la couleur avec :
Code :
imagefilledrectangle ($image_carte, (($x*3)-1), (((300-($y*3))-1)), (($x*3)+1), (((300-($y*3))+1)), $color);
qui se trouve... dans le while.

enfin je revois ça ce soir de toute façon en esperant que cette fois je trouve un petit truc qui m'as echapé
loka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 14h08   #8
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Si je puis me permettre une suggestion : sors les appels à ImageColorAllocate() de ta boucle, crée un tableau associatif $colors avec des champs nommés correctement : un champ pour chaque ImageColorAllocate() (que tu appelles donc à ce moment-là).

Dans le switch de ta boucle, copie simplement le bon champ de ton tableau associatif dans $color.

Code :
1
2
3
4
5
6
7
switch($fond){
         case "1" :
            $color = $colors['bleu'];
            break;
         case "2" :
            $color = $colors['rose'];
            break;
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 15h51   #9
Rédacteur
 
Avatar de loka
 
Homme Romain PERRUCHON
Architecte - Expert Technique
Inscription : novembre 2004
Messages : 2 664
Détails du profil
Informations personnelles :
Nom : Homme Romain PERRUCHON
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Architecte - Expert Technique
Secteur : Service public

Informations forums :
Inscription : novembre 2004
Messages : 2 664
Points : 3 607
Points : 3 607
bien sur que tu peux te permettre ^^

je vais essayer
loka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 18h36   #10
Rédacteur
 
Avatar de loka
 
Homme Romain PERRUCHON
Architecte - Expert Technique
Inscription : novembre 2004
Messages : 2 664
Détails du profil
Informations personnelles :
Nom : Homme Romain PERRUCHON
Âge : 30
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Architecte - Expert Technique
Secteur : Service public

Informations forums :
Inscription : novembre 2004
Messages : 2 664
Points : 3 607
Points : 3 607
Bon j'ai resolu mon probleme

En fait le probleme venait de imagecolorallocate(), je viens de voir dans la doc que ça alloue une couleur pour l'image, en fait ce qui arrivait, c'est qu'au bout d'un moment, l'allocation echouée (vu que c'est une carte 101*101 ça faisait beaucoup d'allocation !).

En fait elle ne s'utilise pas ainsi, il faut simplement definir ses couleurs AVANT la boucle while avec cette fonction et ensuite dans le switch affecter la bonne couleur ^^

voici le code corrigé :

Code :
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
<?php
header("Content-type: image/png");//on va commencer par declarer que l'on veut creer une image
 
//ensuite on defini la taille de l'image
$image_carte = imagecreate(303,303)   or die ("Cannot Initialize new GD image stream");
 
//maintenant on donne une couleur a notre image (ici un fond noir)
$fond_carte=Imagecolorallocate($image_carte, 250, 250, 250);
 
//Commme d'ab
require_once "../fonctions.php";
db_connexion();
 
$nean = Imagecolorallocate($image_carte, 0, 0, 0);
$plaine = Imagecolorallocate($image_carte, 129, 156, 84);
$colline = Imagecolorallocate($image_carte, 96, 110, 70);
$montagne = Imagecolorallocate($image_carte, 134, 118, 89);
$desert = Imagecolorallocate($image_carte, 215, 197, 101);
$neige = Imagecolorallocate($image_carte, 232, 248, 248);
$marecage = Imagecolorallocate($image_carte, 169, 177, 166);
$foret = Imagecolorallocate($image_carte, 60, 86, 33);
$eau = Imagecolorallocate($image_carte, 92, 191, 207);
$eau_p = Imagecolorallocate($image_carte, 39, 141, 227);
 
// je vais chercher les terrains dans ma table
$sql = "SELECT x_carte, y_carte, fond_carte FROM carte";
$res = exec_requete($sql);
while ($t = mysql_fetch_assoc($res)){
	$x = $t["x_carte"];
	$y = $t["y_carte"];
	$fond_carte = explode(".",$t["fond_carte"]);
	$fond = $fond_carte[0];
 
	switch($fond){
		case "1" :
			$color = $plaine;
			break;
		case "2" :
			$color = $colline;
			break;
		case "3" :
			$color = $montagne;
			break;
		case "4" :
			$color = $desert;
			break;
		case "5" :
			$color = $neige;
			break;
		case "6" :
			$color = $marecage;
			break;
		case "7" :
			$color = $foret;
			break;
		case "8" :
			$color = $eau;
			break;
		case "9" :
			$color = $eau_p;
			break;
		default :
			$color = $nean;
			break;
	}
	imagefilledrectangle ($image_carte, ((3*$x)-1), (((300-(3*$y)))-1), ((3*$x)+1), (((300-(3*$y)))+1), $color);
}
 
// on affiche l'image
imagepng($image_carte, "carte.png");
ImageDestroy ($image_carte);
header("Location: afficher_carte.php");
?>
merci pour l'aide sinon, en tout cas je vais optimiser certaines choses comme le fait de rajouter les terrains dans la bdd avec un identifiant numerique
loka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 21h55   #11
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
\o/
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h36.


 
 
 
 
Partenaires

Hébergement Web