Bonjour à tous,
Merci de vous pencher sur mon problème !

J'ai construit et affiché une (et plusieurs) image(s) avec la librairie GD en PHP.
Pour cela je crée un fichier PHP (compteur2.php) avec un code qui me construit l'image, puis je l'appelle dans ma page HTML avec <img scr="compteur2.php?pc=x">, ou x définit la longueur de l'image. Jusque là tout fonctionne très bien.

Mais, je vais devoir générer pas mal de ces images et donc je cherche à simplifier mon code dans la page HTML via l'utilisation d'une fonction, ayant pour paramètre la variable $pc (la longueur de l'image). De plus cette image devra subir des traitements (couleur, taille, texte variables, et cela se fera via des switch dans la fonction passée en paramètres).

Mais voilà, dès que je place mes lignes de code dans une fonction, (j'inclus bien sur cette fonction dans mon <body>) et que j'appelle cette fonction via PHP, l'image ne veux pas s'afficher, et j'obtiens un code erreur :

"L'image “(localhost, etc /index.php)” ne peut être affichée car elle contient des erreurs."

Par souci de clarté je n'affiche que mon body (aucun code n'est placé à l'extérieur de toute façon).

<body>
<?php
include("compteur2.php");
?>
<table width="90%" border="0">
	<tr>
		<td>
			<div class="bar">
				<?php jauge(60); ?>
			</div>
		</td>
	</tr>
</table>
</body>


Et le code de ma fonction PHP (situé dans un fichier nommé compteur2.php).
J'ai commenté le code pour ceux qui seraient calés en fonctions en pas en GD.


function jauge($pc) 					 //on crée la fonction jauge utilisant comme paramètre $pc
	{
	//le contenu de la fonction est une création d'image via GD.
		header ("Content-type: image/png"); //on indique que le format retourné est une image
		$image = imagecreate(250,20);       //création d'une image de 250x20px
		$x=($pc*250)/100;				 //on définit "x" qui est facteur de la variable $pc et d'un calcul
		$blanc=imagecolorallocate($image, 255, 255, 255);	//fond d'image blanc
		$noir=imagecolorallocate($image, 0, 0, 0);		//création d'une variable contenant la couleur noire
		$bleu=imagecolorallocate($image, 170, 204, 238);  //création d'une variable contenant le couleur bleue
		imageFilledRectangle($image, 0, 0, $x, 20, $bleu);//on trace un rectangle à partir des coord x: 0 y:0 de longueur: $x, hauteur: 20 couleur: bleu 
		imagestring($image, 3, 110, 3, $pc."%", $noir);	//cette ligne sert à afficher du texte sur l'image
		imagepng($image);							//on place l'image ainsi crée dans la variale $image
	}


la page me retourne donc l'erreur plus haut...
Ai-je mal déclarée/appelée ma fonction ?
Il y'a un problème dans mes déclarations ?

Je précise que je suis débutant en PHP et je suis en très grande difficulté dans le cas présent.
Bonne journée.
Modifié par Wu Xiang (25 Jul 2010 - 07:46)
Salut Wu Xiang »

Ton 5ième param de imagestring est toujours une chaine.


$texte = 'Voici le texte';
$couleur = imagecolorallocate ($image, 0, 0, 0);
imagestring ($image, 3, 110, 3, $texte, $couleur);


Toi tu te sert du param $pc qui est un nombre concaténer à une chaine.
Je crois qu'il te faut transtyper $pc. (string) $pc . " % " »

Ce qui devrais donner 60% comme chaine de caractère.

Je te suggère de placer un 2ième param à ta fonction jauge : genre » $chaine.

» function jauge($pc, $chaine) { . . . instructions . . . }
» imagestring ($image, 3, 110, 3, $chaine, $couleur); ou si tu préfère
» imagestring ($image, 3, 110, 3, (string) $pc . $chaine, $couleur);
» Appelle de la fonction : jauge (60, "%");

Libère les ressources avec : imagedestroy($image);

N'oublis pas que tu envoie l'image directement au navigateur.

Tu peut l'enrégistrer dans ton répertoire aussi. Quoique facultatif ici.
» imagepng ($image, 'images/png/monImage.png', 80); // 3ième param : qualité.
» tu le cible en HTML standard : <img src="images/png/monImage.png" alt=" " />

++ zardoz.
Modifié par zardoz (24 Jul 2010 - 09:10)
salut Smiley smile

EN fait non il faut être calé en gd dans ton cas Smiley lol

la gd va créer une image ça tu l'as compris...

mais tu ne peux pas inclure des fonctions gd dans la page...

Récap...

Tu fais une page php avec un type mime en head de type jpeg ou png enfin tu vois..
dedans tu met tout ce que tu veux de la gd...

Dans une autre page tu appelle la page php via la balise img

tu peux appeler autant de fois que tu veux la page php qui contient la gd avec tout les paramètres que tu veux...


dans ton cas tu as voulu que ce soit une fonction mais ce n'est pas possible de créer une image en fonction... Smiley cligne
Merci bien pour vos réponses !
@zardoz : je comprend ce que tu veux dire, en code brut (sans tenter de l'intégrer dans une fonction) ça marchait bien, mais ça marche aussi avec ta technique. Par contre dès que j'intègre ça dans une fonction mon erreur persiste, donc je pense que ça ne vient pas de là.
Par contre merci pour le coup du image destroy j'étais complètement passé à coté...

@pchlj : Du coup si je comprend bien intégrer le fonctionnement GD dans une Fonction n'a pas l'air possible :s
Mais ce qui m'ennuie c'est que je voulais générer pas mal de jauges en fait (cette fonction me permet d'afficher des jauges graphiques) et la taille, la couleur de fond, la couleur de la barre ou du texte vont varier selon le type de jauge, je pourrai même en avoir une vingtaine différentes par page...
Si je dois passer en paramètres par des $GET_['var'] pour calibrer tout ça (je peux), dans un appel gd classique, je vais avoir une URL de pure dingue avec des &taille=mini&bgcolor=rouge&etc...

Comment est-ce que je pourrais simplifier cet appel ? (on peut seulement ?)
C'est pour ça que la fonction m'intéressait j'appelais avec :
tracejauge(mini, rouge, blanc, 60, pourcentage);
ça revient peut-être au même finalement, je ne sais pas trop si je me prend la tête pour rien...
Merci pour la réponse rapide et pertinente en tout cas !
Salutation Wu Xiang »

Je n'ai pas vérifier concernant les appels de fonction. Je n'utilise pas GD.
Je le trouve médiocre, vis à vis d'autres possibiltés PHP. Il en est de même de SWFviaPHP.

Je ne t'ai donner que le 5ième param de imagestring : Tu ne peut pas concaténer un nombre avec une chaine (string), surtout pas quand le param s'attend en retour une string ». Sauf si tu transtype. (string) $pc . $chaine.

» Une cible ici : les filtres en PHP. Une étude perso genre.

» En effet PHP n'a pas à envier un quelquonque logiciel graphique. PHP étant tout aussi puissant que le grand et maginfique Roi Adobe (flash étant == à un plug-inaiserie).

» Un objet parmis tant d'autres que je respecte. Mais qui a tendance à ce dissiper, à s'évaporer dans le Bing-Bang initiale de l'univers web. Comme une étoile qui s'éteint. Sauf évidemment, en zone commercialement négociable.

Les logiciels Adobe's ne vallent pas plus que NetBeans module PHP 6.9.0 : Avec 31Mo en téléchargement sur ce lien » télécharge le module PHP de NetBeans (gratos). On peut uploader en FTP. Comme en Dreamweaver du Roi Adobe. Et beaucoup d'autres choses évidemment.

Le Roi Adobe perd-t-il de son diadème ? : C'est possible.

++ zardoz.

» Via les pro's de l'écriture. Nous apprenons à écrire le web. En toute simplicité.
Modifié par zardoz (24 Jul 2010 - 23:50)
re wu

non je coris que là tu comprend pas bien l'utilisation de la gd

la gd sert à manipuler et ou créer des images....

donc tu t'en sert comme d'une image classique

ta page en gros si tes barres étaient déjà créées ça ressemblerait à un truc dans ce genre



<img src="image1.jpg" /><br />
<img src="image2.jpg" /><br />
<img src="image3.jpg" /><br />
<img src="image4.jpg" /><br />



Je simplifie hein Smiley cligne

avec la gd ça DOIT donner ça



<img src="imageGD.php?var1=1&var2=2" /><br />
<img src="imageGD.php?var1=1&var2=2" /><br />
<img src="imageGD.php?var1=1&var2=2" /><br />
<img src="imageGD.php?var1=1&var2=2" /><br />



tu passes ce que tu veux en paramètre puisque c'est le php derrière qui va créer l'image que tu veux afficher...

Ta fonction dont tu parles peut très bien être reprise par un switch dans la page de créa de la GD et créer l'image que tu veux avec des couleurs, des fonds des textes, enfin tout ce que tu veux.... t'es libre en php et en même temps ton url changera pas...
Salut pchlj »

Tu parle à qui toi ?.

Si tu n'as pas d'ordre dans tes messages, tu n'en a pas dans ton webDesign perso.

Dis moi à qui tu t'adresse : Wu Xiang, ou zardoz ?.
De grâce « christ nous la paix » : si tu vis dans un désordre.

Les fonctions ont pour job : Le transport de données et l'exécution de ces instructions : Via l'appelle de cette fonction. Je te reviens sur le sujet : Si je porte les bas coups je m'incline devant toi . . .

Je ne vois pas pourquoi une fonction n'exécuterais pas ses instructions. C'est la raison d'être des fonctions

++ zardoz. Écrit le web selon les normes du W3C. En écriture seulement.
Modifié par zardoz (25 Jul 2010 - 00:37)
Excusez moi du double post » C'est pas un flood ici. Loin de là.

Je m'adresse donc @Wu Xiang mais surtout @pchlj. À propos des fonctions via GD.
Semble-t-il que c'est impossible. Je suis en colère là.

Une fonction a pour but d'exécuter des instructions sur appelle. Aucune raison de ne pas s'exécuter sur appelle de la fonction.

Voici la fonction : Vous remarquerez que le header n'est pas présent ici. Fichier : zFonctionImage.php

<?php
 function appelleImage ($largeur, $hauteur)
 {
	# - -
	$image = imagecreate ( $largeur, $hauteur);
	# --
	$noir = imagecolorallocate($image, 0, 0, 0);
	# --
	imagepng ($image);
	imagedestroy ($image);
 }
?>


Appelle de la fonction. Vous remarquerez que j'écrit le header ici, en dehors de la fonction. Vous pourriez très bien détruire l'image ici si çà vous plait : imagedestroy ($image);


<?php
  include_once ('zFonctionImage_01.php');
  header ('Content-type: image/png');
  appelleImage(200, 300);
?>


Alors pchlj : tais toi. C'est à toi de t'incliner. Tu disais que c'est impossible d'appeller une fonction en GD. C'est une farce çà ? - ou quoi.

Oups : Il n'y a pas de code=php » pourquoi ? technologix en a déjà parler de çà.
code tout court fait l'affaire entre temps.

Mon but Wu Xiang était le 5ième param : Tu ne peux pas concaténer un nombre avec un string sans transtyper le nombre en string, comme présenter en topPage sur mes messages. Parce que le progamme s'attend à un string. (string) $pc . $variableTexte ici au 5ième param.

Mais les fonctions çà marche »

En tout cas : @pchlj : dégage. Ou sache t'exprimer pour qu'on te suive correct. Si tu n'as pas d'ordre dans tes messages sur Alsacréations, je ne veux même pas voir ton web perso.

Si tu n'as pas d'ordre dans ton classeur, tu n'en a pas non plus dans ton placard. Et nul part ailleurs dans ta maison, de toute façon.

++ zardoz.
Modifié par zardoz (25 Jul 2010 - 07:10)
@zardoz : En fait le problème final ne provenait pas de la variable concaténée, MAIS il est vrai que transtyper le 5ème paramètre est beaucoup plus "propre". Par conséquent c'est ce que j'ai fait dans la dernière version de mon code.
un grand MERCI pour la fonction imagedestroy($image) que j'avais complètement oubliée et qui m'aurait mangé des ressources serveur pour rien !
En réalité ce que Pchlj voulait dire ce n'est pas qu'il n'est pas possible de créer des fonctions utilisant GD, mais qu'il n'est pas utile de le faire :
En utilisant GD, via l'appel de l'image dans mon code HTML, il s'agit en fait d'un appel de fonction mais différent de la syntaxe habituelle. Or moi je cherchais à imbriquer des fonctions les unes dans les autres, ce qui n'était pas très optimisé...
Bien sur le dernier code que tu as posté est très viable ! Par conséquent je vais m'entrainer un peu avant d'utiliser des fonctions trop complexes pour moi, et je vais perfectionner mon code en m'inspirant de ton appel de fonction dans les jours à venir.

@pchlj : Merci pour ta seconde explication, tu m'as ouvert les yeux sur le fonctionnement de GD que je comprenais de manière très erronée (voir totalement fausse).
J'ai compris mon erreur...Les variables étant passées en URL, je devais les appeler via $GET et non pas via les variables $ classiques...C'était pour cette raison que l'image était corrompue, les variables n'étant pas correctement définie elles restaient NULL...
Depuis, ça fonctionne ! Et j'ai complexifié mon code dans le fichier jauge.php que j'appelle pour générer mes images, en ajoutant des possibilités de changer la couleur, la taille, le type ou le format d'image, etc.

Merci encore à vous deux pour votre aide.
Puisque mon problème est résolu j'édite l'intitulé du message.
Mon problème de fonction faisant partie du code qui me permet de générer des jauges graphiques, vous pouvez consulter l'intégralité du code qui à été terminé (mais pas forcément optimisé à fond, puisqu'il me reste encore le transtype string() à rajouter) dans ce post :

http://forum.alsacreations.com/topic-1-50052-1-Problemes-lors-de-la-conception-dune-jauge-de-progression.html

Bonne journée à tous !
Salut Wu Xiang

Bon d'accord : Le prob avec pchlj » C'est qu'il n'écrit pas pour la communauté.
Il est en accord avec le questionneur, mais pas nécesairement avec la communauté.
Il est parfois difficile à suivre. Surtout sur ta question. Il s'infiltre mais sans header.

J'ai vu que vous avez finaliser sur un autre topic. D'accord. Mais moi j'étais en colère.
De déclarer qu'il est impossible d'écrire GD sous fonction. Là vraiment je ne comprenais pas.

Mon seul but était de te rendre compte du 5ième param.

Remarque que je peux allez plus profond sur l'autre topic.
D'ailleurs je ne suis pas étonner, de tes résultats. J 'ai même appris.

Et des excuses envers pchlj. L'impossible en programmation n'existe pas.
N'as-tu pas résolu ton prob, via Alsacréations ? - This is a good way.

++ zardoz.
Modifié par zardoz (25 Jul 2010 - 09:09)
Re WU (je le met en gros cette fois-ci) Smiley cligne

Il est vrai zardoz que je ne précise pas forcément à qui je parle, mais comme tu le dit je répond au questionneur.... surtout si les autres participants vont dans le même sens Smiley smile
Etant complètement d'accord avec ce que tu disais je continuais la réflexion pour aider WU...

Je vais faire plus attention... il est vrai que tout le monde lit, et je n'y pense pas toujours, je m'adresse en général à la personne qui pose la question et sinon je cite pour les autres...

Du coup tu as compris de toi même pourquoi je parlai de ne pas avoir de fonction GD...

Tout va pour le mieux dans le meilleur des mondes, à nous deux nous avons donné toutes les solutions à Wu, c'est l'essentiel...

Bonne journée à tous
@pchij »

C'est bien en tout cas. C'est moi qui a dérapper un peu. Et je m'en excuse.

Je serai toujours en accord avec une communication propre pour les lecteurs
qui viennent apprendre via Alsacréations. Pour moi c'est bien important.

++ zardoz.