# Les fonctions graphiques de PHP
Comment, mieux qu'à l'aide d'un graphique lié, peut-on
illustrer un tableau issu d'une base de données, un résultat
de sondage, etc. ? Nous nous proposons de mettre en uvre ici quelques
unes des fonction de php qui le permettent.
Créer une première image
nous allons créer un fichier "dessin.php3" sur le serveur
de free. Cet hébergeur offre en effet gratuitement le support php
aux webmestres qui y ont un compte.
Rappel : Les noms de fonctions en PHP ne sont pas "case-sensitives".
Les commentaires PHP sont précédés par deux traits
obliques ou bien encadrés par /*....*/.
<?
/* comme nous souhaitons générer un flux qui sera expédiédirectement
au Browser nous utilisons la fonction header() pour créer un
en-tête HTTP sous la forme d'une chaîne de caractère.
Attention : cette fonction un peu spéciale DOIT être placée
AVANT tout contenu dans le document. */
header("content-type: image/gif");
/* pour des raisons de licence (gif n'est pas un format libre),
les dernières versions de php ne peuvent créer que des
image au formatPng. Notre en-tête de fichier image devrait alors
être rédigé ainsi : content-type: image/png. */
$monImage = imageCreate(200,100);
/* La fonction imageCreate crée ici une image blanche, de largeur
200 et de hauteur 100 pixels. Cette fonction retourne un identifiant,
information requise pour toutes nos opérations à venir.
*/
/* imagecolorallocate() permet de définir une couleur en RVB,
Cette fonction doit être appelée pour créer chaque
couleur qu'utilisera notre image. Ici nous stockons ces couleurs dans
autant de variables */
$noir = imageColorAllocate($monImage, 0,0,0);
$jaune = imageColorAllocate($monImage, 255,255,0);
$vert = imageColorAllocate($monImage, 0,255,0);
$rouge = imageColorAllocate($monImage, 255,0,0);
$bleu = imageColorAllocate($monImage, 0,0,255);
$gris = imageColorAllocate($monImage, 128,128,128);
$blanc = imageColorAllocate($monImage, 255,255,255);
// nous pouvons dés lors remplir notre rectangle par :
imageFill($monImage, 0, 0, $gris);
/* cette fonction comme beaucoup d'autre on va le voir peut être
assimilée à l'outil pot de peinture de nombreux logiciel.
Il s'agit ici de remplir toute une surface de pixels contigus et monochrome
à partir d'un point passé en paramètres. Dans le
cas qui nous intéresse ici les coordonnées de départ
du remplissage importent peu !
à l'intérieur de notre image nous souhaitons maintenant
dessiner un rectangle évidé et deux traits obliques. Pour
le rectangle nous passons à la fonction imageRectangle() les
coordonnées gauche, haute, droite et basse du rectangle intérieur.
Ces coordonnées sont notées depuis l'angle supérieur
gauche de l'image */
imageRectangle($monImage, 20,10,180,90, $blanc );
// on tire les deux traits blancs. Il faut cette fois passer quatre
coordonnées marquant deux à deux les points de départ
et d'arrivée du trait :
imageLine($monImage, 0,0,200,100, $blanc );
imageLine($monImage, 0,100,200,0, $blanc );
/* et si nous voulons voir dès lors le résultat ? La
fonction imageGif($monImage, "nomDeFichier.gif") crée
un fichier image Dans le répertoire courant du serveur.
Si l'image n'a pas de couleur transparente (définie par imagecolortransparent())
son format sera GIF87. GIF89 dans l'autre cas. Maintenant si l'on ne
passe aucun nom de fichier en argument, aucun fichier ne sera crée
sur le serveur mais sera transmis directement à la sortie standard.
Parce que nous avons fait usage de la fonction header()), nous pouvons
exploiter cette possibilité :*/
imageGif($monImage); // PHP 4 : imagePng($monImage)
/* et libérer la mémoire de l'image créée
par :
imageDestroy($monImage);
?>
Pour voir notre image, on télécharge en ftp notre fichier
sur le serveur de free à coté du document HTML d'appel.
Dans le browser on saisit son adresse. http://moi.free.fr/dessin.php3

Plus traditionnellement pour faire apparaître notre images dans
la page HTML nous utiliserions la balise IMG ainsi rédigée
:
<IMG SRC="dessin.php3">
Aller plus loin
Notre image en l'état n'est certes pas très intéressante.
Nous voulons obtenir un bouton et y faire apparaître le texte de
notre choix. Nous savons que si nous appelons le fichier php ainsi :
<IMG SRC="dessin.php3?leTexte='Clic' ">
Le serveur créera automatiquement la variable globale $leTexte
et la mettra à la disposition de notre script. Nous reprenons donc
"dessin.php3" et le modifions ainsi :
header("content-type: image/gif");
$monImage = imageCreate(200,100);
$noir = imageColorAllocate($monImage, 0,0,0);
$jaune = imageColorAllocate($monImage, 255,255,0);
$vert = imageColorAllocate($monImage, 0,255,0);
$rouge = imageColorAllocate($monImage, 255,0,0);
$bleu = imageColorAllocate($monImage, 0,0,255);
$gris = imageColorAllocate($monImage, 128,128,128);
$blanc = imageColorAllocate($monImage, 255,255,255);
imageFill($monImage, 0, 0, $bleu);
imageRectangle($monImage, 20,10,180,90, $blanc );
imageLine($monImage, 0,0,200,100, $blanc );
imageLine($monImage, 0,100,200,0, $blanc );
/* Nous allons remplir les bords de notre dessin. Encore une fois
il faut que nous imaginions utiliser un outil pot et cliquer en un point
précis de l'image pour remplir toutes les zones contiguës
jusqu'une certaine couleur : */
imagefillToBorder( $monImage , 100,5, $blanc, $gris );
/* traduction : remplit avec du gris toute la surface depuis le point
de coordonnées 100,5 (le milieu en haut), jusqu'aux contours
blancs */
imagefillToBorder( $monImage , 5,50, $blanc, $gris );
imagefillToBorder( $monImage , 100,95, $blanc, $noir );
imagefillToBorder( $monImage , 195,50, $blanc, $noir );
// voilà ce que cela donnerait à ce stade :
/* Pour placer un rectangle plein blanc par dessus, on doit passer à
la fonction imageFilledRectangle() quatre coordonnées gauche,
haute, droite et basse du rectangle :
imageFilledRectangle($monImage, 20,10,180,90, $blanc );

/* dessiner un cercle ou un ovale c'est passer en argument le delta
du centre (x ,y), une largeur, une hauteur, un angle de début,
un angle de fin (sens horaire) : */
imageArc( $monImage, 100,50,30,20, 0, 360, $rouge );
// on remplit tout de suite cet ovale en "cliquant" au centre
avec notre "outil pot" :
imagefillToBorder( $monImage , 100,50, $rouge, $jaune );

/* nous allons maintenant écrire dans notre jaune uf,
précisément la chaîne passée en query string.
Rappel le serveur à créer automatiquement la variable
$leTexte et lui a donné la valeur "clic". nous pouvons
donc au lieu de coder "en dur" une chaîne de caractères
utiliser cette variable et la passer en argument à la fonction
imageString().*/
imageString($monImage, 5, 82, 42, $leTexte, $noir);

/* la fonction imageString() requiert en argument un entier indiquant
police et tailles devant être utilisées. Les valeurs 1,2,3,4,5
permettent de faire appel aux polices par défaut du serveur.
Il serait possible de charger d'autres polices avec imageLoadFont()
et d'utiliser la valeur numérique que retourne cette fonction
ici. Les deux autres entiers (82,42) marquent la position du premier
caractère du texte. Ici le placement et "pifométrique"
mais imagettfbbox() permettrait de connaître l'espacement requis
par une chaîne de caractère à l'aide d'une police
déterminée. */
// On créé le fichier image (ici de nouveau directement
sur la sortie standard et on libère la ram.
imageGif($monImage);
imageDestroy($monImage);
?>
Créer un graphique en camembert
S'il existe des fonctions comme imageFilledRectangle() ou imageFilledPolygon()
il n'est pas possible directement en revanche de remplir un arc de cercle.
Nous allons ici mettre en uvre une astuce afin de dessiner un camembert.

On crée d'abord un fichier "camembert.php3" qui sera
appelé dans notre document HTML par une balise image standard.
Nous passerons dans la requête les paramètres angle de début
de l'arc plein, angle fin et couleur.
<IMG SRC="camembert.php3?debut=0&fin=200&couleur=vert">
Afin de rendre cela possible, "camembert.php3 sera rédigé
ainsi :
<?
header("content-type: image/gif");
$monImage = imageCreate(300,300);
$noir = imageColorAllocate($monImage, 0,0,0);
$jaune = imageColorAllocate($monImage, 255,255,0);
$vert = imageColorAllocate($monImage, 0,255,0);
$rouge = imageColorAllocate($monImage, 255,0,0);
$bleu = imageColorAllocate($monImage, 0,0,255);
$gris = imageColorAllocate($monImage, 128,128,128);
$blanc = imageColorAllocate($monImage, 255,255,255);
imageFill($monImage, 0, 0, $noir);
/* on va maintenant créer une cinquantaine d'arcs de cercle
correspondant à la portion à représenter, en réduisant
à chaque fois leur diamètre : */
for( $diametre = 100; $diametre > 0 ; $diametre -= 2)
{
imageArc( $monImage, 150,150, $diametre , $diametre
, $debut, $fin, $$couleur );
}
/* on le voit c'est ici que l'on utilise de façon répétée
nos valeurs début, fin et couleur. Parceque la couleur est passée
sous la forme d'une chaîne de caractères "vert",
et que la valeur correspondante est créée dans le script
sous la forme d'une variable "$vert", il nous faut déréférencer
la variable $couleur créée par l'interpreteur php. En
écrivant $$couleur nous recréons la variable "$vert".
*/
// on remplit de rouge toute la portion restante :
for($diametre = 100; $diametre > 0 ; $diametre -= 2){
imageArc( $monImage, 150,150, $diametre , $diametre , $fin, $debut,
$rouge );}
// Pour placer avec précision une légende maintenant
:
$part = ($fin - $debut);
// c'est la proportion, nous voulons la légende au milieu de
la part
$alpha = $debut + $part/2;
//c'est l'angle dont on doit trouver le delta
// cet angle est en degrés or les fonction trigonométriques
retournent une valeur en radians
//on convertit :
$alpha = $alpha * 2*M_PI/360;
//Rappel le delta c'est la position du centre + le rayon * cos(alpha)
et le centre + le rayon * sin(alpha)
$posX = 150 + 100/2 * cos($alpha);
$posY = 150 + 100/2 * sin($alpha);
//on écrit donc la légende en jaune police n° deux
:
imageString($monImage, 2, $posX, $posY, "légende",
$jaune);
imageGif($monImage);
imageDestroy($monImage);
?>
Sur php il n'y pas lieu de chercher ailleurs que sur le site http://www.php.net/
|