|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PHP - Génération d'imagesPrérequisPHP permet de créer des images au format GIF à l'aide d'une librairie de fonctions prévue à cet effet. La librairie permettant de créer et manipuler des fichiers graphiques se nomme GD, ainsi, pour pouvoir utiliser ces fonctions il faut que PHP soit installé avec l'extension GD, c'est-à-dire passer le paramètre --with-gd. La librairie de fonctions GD permet de créer assez facilement des fichiers au format GIF, en fonction par exemple de données stockées dans un SGBD (Système de gestion de bases de données). Il faut tout de même savoir que ce genre de procédé met à rude épreuve le processeur, il faut donc utiliser ces fonctions à bon escient (par exemple pour des diagrammes statistiques à barre, des graphiques sectoriels, ...). Comment utiliser ces fonctionsLes fonctions de la librairies GD permettent de retourner une image, c'est-à-dire un fichier GIF. Ainsi un tel fichier ne peut envoyer du texte au navigateur, il doit obligatoirement être appelé à partir d'une page HTML (généralement avec une balise <IMG src="mon_fichier.php3">). D'autre part, pour que le navigateur sache qu'il s'agit d'un fichier de type GIF, la premiere chose à faire (avant d'envoyer n'importe quelle autre information au navigateur) est d'envoyer un en-tête HTTP indiquant le type MIME du fichier, c'est-à-dire : headers("Content-Type: image/gif"); La principale fonction de la librairie est imagegif() elle permet de retourner au navigateur l'image créée avec les autres fonctions, en passant en paramètres un entier identifiant l'image. Si jamais le nom du fichier est passé en second argument, le fichier est écrit sur le disque. booléen imagegif(entier image, chaîne NomDuFichier);
La fonction imagecreate() permet de créer un identifiant pour une image vierge possèdant les dimensions indiquées en paramètres. entier imagecreate(entier largeur,entier hauteur); La fonction imagecreatefromgif() permet de créer un identifiant pour l'image créée à partir d'une image GIF existant sur le disque, en passant en paramètre le nom du fichier. entier createimagefromgif(chaîne NomDuFichier); Enfin la fonction imagedestroy() permet de vider la mémoire allouée à l'image dont on a passé l'identifiant en paramètre. booléen imagedestroy(entier image);Voilà donc un script minimal (et inutile) créant une image PHP à partir d'une image présente sur le disque : <?php headers("Content-Type: image/gif"); $image = imagecreatefromgif("toto.gif"); imagegif($image); ?> L'allocation de couleurLa majeure partie des fonctions de la librairie GD permettent de créer une image,
La plupart des fonctions graphiques nécessitent le passage en paramètre d'une couleur. Ainsi, PHP fournit des fonctions permettant d'allouer une couleur à une image en spécifiant les composantes RGB (Red, Green, Blue soient Rouge, Vert et Bleu) de la couleur. La fonction imagecolorallocate() alloue une couleur à une image en spécifiant ses composantes RGB sous forme entière (0 à 255 pour chaque composante), ou hexadécimale (0x00 à 0xFF pour chaque composante). entier imagecolorallocate(entier image, entier rouge,entier vert, entier bleu);Voici quelques exemples d'allocation de couleurs avec cette fonction (avec les composantes en hexadécimal ou en entier) : $noir = imagecolorallocate($image,0,0,0); $rouge = imagecolorallocate($image,255,0,0); $vert = imagecolorallocate($image,0,0xFF,0); La création de formesLa librairie GD fournit un panel de fonctions permettant de créer des formes primaires telles que :
Voici un tableau présentant les fonctions de génération de forme :
Voici un exemple montrant comment créer des formes simples avec PHP : <?php $image = imagecreate(160,100); $fond = imagecolorallocate($image,0xEF,0xF2,0xFB); $noir = imagecolorallocate($image,0,0,0); imagefill($image,0,0,$fond); imagefilledpolygon($image,array(80,15,45,85,125,85),3,$noir); header("Content-Type: image/gif"); imagegif($image); ?>Deux fonctions supplémentaires vous permettront de remplir une zone avec une couleur :
Les chaînes de caractèresPHP permet d'autre part de dessiner des chaînes de caractères dans une image grâce à une grande variété de fonctions dédiées. Cela autorise ainsi la création de légendes ou de boutons dynamiques, en fonction du texte passé en paramètre, stocké dans un fichier, ou bien dans une base de données. La principale fonction permettant de créer des chaînes de caractères dans l'image est imagestring() : booléen imagestring(entier image, entier police, entier x, entier y, chaine texte, entier couleur);Cette fonction permet de créer une chaîne de caractères contenant le texte passé en argument à la position spécifiée par les arguments (x,y) avec la police indiquée. En réalité PHP propose 5 polices par défaut numérotées de 0 à 5, mais il est possible de spécifier une police p[ersonnalisée grâce à la fonction imageloadfont() : Entier imageloadfont(chaîne Nom_du_Fichier); Le format du fichier de police passé en paramètre peut varier selon le système sur lequel PHP fonctionne... Enfin, les fonctions imagefontwidth() et imagefontheight() renvoient la largeur et la hauteur de la police passée en unique paramètre. Ainsi, il est facile de connaître le nombre de pixels que va occuper la chaîne entière : $largeur = imagefontwidth($police) * strlen($text); $hauteur = imagefontheight($police); Voici un tableau présentant les fonctions de création de chaînes de caractères graphiques :
Un diagramme des navigateurs de vos visiteursLe script suivant est fourni par le webmaster de C'est quoi Linux. Il vous permet
de créer une image contenant un diagramme circulaire des navigateurs de vos visiteurs, sachant que ceux-ci
sont stockés dans une table appelée visiteurs dans un champ nommé navigateur.
Voici le code PHP : <? header("Content-type: image/gif"); $host="votre.base.de.donnees"; $user="votre.login"; $pass="votre.mot.de.passe"; $bdd="nom_de_la_base"; mysql_connect($host,$user,$pass); mysql_select_db($bdd); $query="SELECT navigateur FROM visiteurs"; $result=mysql_query($query); $netscape3=0; $netscape4=0; $ie3=0; $ie4=0; $ie5=0; $autre=0; while($row=mysql_fetch_row($result)) { $total++; if(ereg("3(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0])) { $netscape3++; } if(ereg("4(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0])) { $netscape4++; } if(ereg("MSIE(\_?)( ?)3",$row[0]) ) { $ie3++; } if(ereg("MSIE(\_?)( ?)4",$row[0]) ) { $ie4++; } if(ereg("MSIE(\_?)( ?)5",$row[0]) ) { $ie5++; } if( (!ereg("3(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0])) &&(!ereg("4(\.)([0-9]+) (\[)([a-z]+)(\])(.*)$",$row[0])) &&(!ereg("MSIE(\_?)( ?)3",$row[0]) ) &&(!ereg("MSIE(\_?)( ?)4",$row[0]) ) &&(!ereg("MSIE(\_?)( ?)5",$row[0]) )) { $autre++; } } mysql_close(); function compare($navig,$nbre) { if($navig==$netscape3) { $navig++; } if($nbre!=1) { if($navig==$netscape4) { $navig++; } } if($nbre>2) { if($navig==$ie3) { $navig++; } } if($nbre>3) { if($navig==$ie4) { $navig++; } } if($nbre>4) { if($navig==$ie5) { $navig++; } } return($navig); } $netscape3=$netscape3*10; $netscape4=$netscape4*10; $ie3=$ie3*10; $ie4=$ie4*10; $ie5=$ie5*10; $autre=$autre*10; $netscape4=compare($netscape4,1); $ie3=compare($ie3,2); $ie4=compare($ie4,3); $ie5=compare($ie5,4); $autre=compare($autre,5); function radians($degrees) { return($degrees * (pi()/180.0)); } function circle_point($degrees, $diameter) { $x = cos(radians($degrees)) * ($diameter/2); $y = sin(radians($degrees)) * ($diameter/2); return(array($x,$y)); } $ChartDiameter = 130; $ChartFont = 2; $ChartFontHeight = imagefontheight($ChartFont); $ChartFontWidth = imagefontwidth($ChartFont); $ChartData = array($netscape3,$netscape4,$ie3,$ie4,$ie5,$autre); $ChartData2 = array($netscape3=>"Netscape 3", $netscape4=>"Netscape 4", $ie3=>"Internet Exploreur 3", $ie4=>"Internet Exploreur 4", $ie5=>"Internet Exploreur 5", $autre=>"Autres Navigateurs"); $ChartWidth = $ChartDiameter + 20 + ($ChartFontWidth * 40); $ChartHeight = $ChartDiameter + 20; rsort($ChartData); arsort($ChartData2); $ChartCenterX = $ChartDiameter/2 + 10; $ChartCenterY = $ChartDiameter/2 + 10; $image = imagecreate($ChartWidth, $ChartHeight); $colorBody = imagecolorallocate($image,0xEF,0xF2,0xFB); $colorBorder = imagecolorallocate($image,0x00,0x00,0x00); $colorText = imagecolorallocate($image,0x00,0x00,0x00); $colorSlice[]= imagecolorallocate($image,0x76,0x89,0xFF); $colorSlice[]= imagecolorallocate($image,0x96,0xA6,0xFF); $colorSlice[]= imagecolorallocate($image,0xA6,0xB9,0xFF); $colorSlice[]= imagecolorallocate($image,0xB6,0xC9,0xFF); $colorSlice[]= imagecolorallocate($image,0xC6,0xD9,0xFF); $colorSlice[]= imagecolorallocate($image,0xD6,0xE9,0xFF); imagefill($image,0,0,$colorBody); $Degrees = 0; for($index=0; $index < count($ChartData); $index++) { $ChartDataReel=(int)($ChartData[$index]/10); if( $ChartDataReel !=0) { $StartDegrees = round($Degrees); $Degrees+= (($ChartDataReel/$total)*360); $EndDegrees = round($Degrees); $CurrentColor = $colorSlice[$index%(count($colorSlice))]; imagearc($image, $ChartCenterX, $ChartCenterY, $ChartDiameter, $ChartDiameter, $StartDegrees, $EndDegrees, $CurrentColor); list($ArcX, $ArcY) = circle_point($StartDegrees, $ChartDiameter); imageline($image, $ChartCenterX, $ChartCenterY, floor($ChartCenterX + $ArcX), floor($ChartCenterY + $ArcY), $CurrentColor); list($ArcX, $ArcY) = circle_point($EndDegrees, $ChartDiameter); imageline($image, $ChartCenterX, $ChartCenterY, floor($ChartCenterX + $ArcX), floor($ChartCenterY + $ArcY), $CurrentColor); $MidPoint = round((($EndDegrees - $StartDegrees)/2) + $StartDegrees); list($ArcX, $ArcY) = circle_point($MidPoint, $ChartDiameter/2); imagefilltoborder($image, floor($ChartCenterX + $ArcX), floor($ChartCenterY + $ArcY), $CurrentColor, $CurrentColor); } } imagearc($image, $ChartCenterX, $ChartCenterY, $ChartDiameter, $ChartDiameter, 0, 360, $colorBorder); for($index=0; $index < count($ChartData); $index++) { $CurrentColor = $colorSlice[$index%(count($colorSlice))]; $LineX = $ChartDiameter + 20; $LineY = 30 + ($index*($ChartFontHeight + 2)); imagerectangle($image, $LineX, $LineY, $LineX + $ChartFontHeight, $LineY + $ChartFontHeight, $colorBorder); imagefilltoborder($image, $LineX + 2, $LineY + 2, $colorBorder, $CurrentColor); $valeur=(int)($ChartData[$index]/10); $valeur2=$ChartData[$index]; $pourcentage=round(($valeur/$total)*100); imagestring($image, $ChartFont, $LineX + 5 + $ChartFontHeight, $LineY, "$ChartData2[$valeur2]", $colorText); imagestring($image, $ChartFont, $LineX + 5 + $ChartFontHeight+ 23*$ChartFontWidth, $LineY, "$valeur", $colorText); imagestring($image, $ChartFont, $LineX + 5 + $ChartFontHeight+ 31*$ChartFontWidth, $LineY, "$pourcentage %", $colorText); } imagegif($image); ?> Trucs & astuces pertinents trouvés dans la base de connaissances
Discussions pertinentes trouvées dans le forum
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||