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

Bibliothèques et frameworks PHP Discussion :

[ImageMagick] Création d'un aperçu de carte


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    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 : 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
    <?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

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Je crois comprendre que, à cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

  3. #3
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    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

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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.

  5. #5
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    en fait j'avais déjà ajouté le default de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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 :/

  7. #7
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    switch($fond){
             case "1" :
                $color = $colors['bleu'];
                break;
             case "2" :
                $color = $colors['rose'];
                break;

  9. #9
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    bien sur que tu peux te permettre ^^

    je vais essayer

  10. #10
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    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 : 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
    <?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

  11. #11
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    \o/

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

Discussions similaires

  1. [ImageMagick] Création d'image avec des apostrophes
    Par Adaviada dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 05/07/2007, 12h35
  2. [ImageMagick] Création image transparente
    Par alexmorel dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 05/10/2006, 15h26
  3. [ImageMagick] Création d'une image miniature
    Par popeye82 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 01/02/2006, 20h10
  4. [ImageMagick] Création d'image à la volée
    Par gdawirs dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 21/11/2005, 15h53
  5. [ImageMagick] Création de vignettes (images réduites)
    Par tom06440 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 22/10/2005, 15h00

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