Manipulation d'images en PHP - Librairie GD

Auteur: Mohamed CHINY Durée necessaire pour le cours de Manipulation d'images en PHP - Librairie GD Niveau recommandé pour le cours de Manipulation d'images en PHP - Librairie GD Supports vidéo non disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz non disponibles pour ce cours

Page 7: Ecrire du texte sur une image

Toutes les pages

Les textes

Sur une image, il n'y a pas toujours que des formes comme des lignes ou des cercles, mais il est parfois utile de pouvoir écrire aussi. En effet, si on veut créer un diagramme ou un graphique, il est inconcevable de ne pas y mettre du texte.

Ecrire du texte: fonction imagettftext()

En GD, il existe les fonctions imagestring() et imagestringup() qui permettent d'écrire horizontalement ou verticalement. Cependant, le rendu de ces deux fonctions est médiocre, c'est pourquoi la plupart des utilisateurs (y compris moi) préfèrent faire appel à la fonction imagettftext().

La fonction imagettftext($img , $taille , $angle , $x_debut , $y_debut , $couleur , $police , $str) permet d'écrire un texte à l'aide des polices TTF (True Type Fonts), dont les paramètres sont:
  • $img: identifiant de l'image créée à l'aide de imagecreatetruecolor().
  • $taille: entier qui désigne la taille de la police en points.
  • $angle: entier qui désigne l'angle d'inclinaison du texte. Les angles sont spécifiés dans le sens anti-horaire (sens inverse des aiguilles d'une montre).
  • $x_debut et $y_debut: désignent les coordonnées du point de début de l'écriture. Il correspond au point bas gauche du premier caractère du texte à écrire.
  • $couleur: identifiant de la couleur créée par la fonction imagecolorallocate().
  • $police: chemin du fichier TTF de la police souhaitée. Il est préférable de toujours préfixer le chemin relatif par point slash ( ./ ).
  • $str: correspond à la chaîne de caractères que l'on souhaite écrire sur l'image (en utilisant l'encodage UTF-8). Notez que si la chaîne est trop grande, alors la partie qui en dépasse sera ignorée (Il n'y a pas de retour automatique à la ligne).

Exemple:
<?php
   header("content-type:image/png");
   $x=400;
   $y=300;
   $img = imagecreatetruecolor($x,$y);
   $gris = imagecolorallocate($img,220,220,220);
   $bleu = imagecolorallocate($img,0,0,200);
   imagefill($img,0,0,$gris);
   imagettftext($img,64,0,25,$y/2,$bleu,"./htower.ttf","Bonjour");
   imagepng($img);
?>
Ce qui donne:

Exemple pratique: CAPTCHA

CAPTCHA désigne Completely Automated Public Turing test to tell Computers and Humans Apart qui signifie "Test public de Turing entièrement automatique permettant de distinguer les robots des humains". Comme son nom l'indique, il consiste à empêcher les robots (ou logiciels automatiques) d'effectuer des enregistrements abusifs via des formulaires afin de ne pas polluer la base de données avec des informations inutiles.

Un des moyens les plus simples pour réaliser un CAPTCHA consiste à afficher une suite de caractères (souvent peu déformés) qui seront à la base reconnaissables par les humains et pas par ces logiciels. On invite alors le client à reproduire ces caractères dans une zone de texte. Si ce qui a été saisi correspond au CAPTCHA alors on estime que c'est un humain qui est entrain de s'inscrire.

Dans cet exemple, on va inviter le client à reproduire les caractères du CAPTCHA. Pour que celui-ci soit complètement aléatoire, on va changer (aléatoirement) la police, la couleur, la position verticale et l'inclinaison de chaque caractère.

Voilà le code source:
<?php
   session_start();
   $x=300;
   $y=100;
   $img=imagecreatetruecolor($x,$y);
   $blanc=imagecolorallocate($img,255,255,255);
   $orange=imagecolorallocate($img,220,100,0);
   $bleu=imagecolorallocate($img,10,10,100);
   $rouge=imagecolorallocate($img,120,0,0);
   $rose=imagecolorallocate($img,200,80,80);
   imagefill($img,0,0,$blanc);
   $couleur=array($orange,$bleu,$rouge,$rose);
   $offset=array(-10,0,10);
   $angle=array(-15,0,15);
   $taille=array(24,34,44);
   $police=array("./akbar.ttf","./AllCaps.ttf","./ALPHMA_.TTF","./ALMAGRO.TTF");
   $chaine="ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
   $nbr=6;
   $cap="";
   for($i=0;$i<$nbr;$i++){
      $car=substr($chaine,mt_rand(0,strlen($chaine)-1),1);
      $cap.=strtoupper($car);
      imagettftext($img,$taille[array_rand($taille)],$angle[array_rand($angle)],$i*($x/$nbr)+10,$y-20+$offset[array_rand($offset)],$couleur[array_rand($couleur)],$police[array_rand($police)],$car);
   }
   imagepng($img,"captcha.png");
   
   @$captcha=strtoupper($_POST["captcha"]);
   @$valider=$_POST["valider"];
   if(isset($valider)){
      if($captcha==$_SESSION["cap"])
         $message="<font color='green'>CAPTCHA valide.</font>";
      else
         $message="<font color='red'>CAPTCHA invalide.</font>";
   }
   $_SESSION["cap"]=$cap;
?>

<html>
   <head>
      <style>
         body{
            padding-top:100px;
            font:10pt "Century Gothic";
         }
         input{
            font:14pt "Century Gothic";
            border:solid 1px #AAAAAA;
            padding:10px;
            margin:10px;
            border-radius:10px;
         }
         input[type="submit"]{
            border:none;
            background-color:#888888;
            color:#FFFFFF;
         }
      </style>
   </head>
   <body>
      <center>
         <img src="captcha.png">
         <form name="fo" method="post" action="">
            <input type="text" name="captcha"><br>
            <input type="submit" name="valider" value="Comparer"><br>
            <?php echo $message ?>
         </form>
      </center>
   </body>
</html>
Et voilà un extrait du résultat: