Si vous souhaitez utiliser une police au format TTF vous devez faire appel à imagettftext(). Contrairement à imagestring() qui définit les coordonnées du texte par rapport au coin haut gauche, imagettftext() définit les coordonnées du texte par rapport au côté gauche et à la baseline du texte
Positionner un texte aux coordonnées x = 0, y = 30 n'affichera pas le même résultat dans les deux cas.
Voici un code qui affiche plusieurs exemples du même texte. Une ligne de fond est affichée à 50 pixels. L'exemple #1 utilise imagestring, les autres imagettftext :
- #2 : Ligne de base du texte sur la ligne
- #3 : Au dessus de la ligne
- #4 : Sous la ligne
- #5 : Centré par rapport à la ligne
<?php
function CaptchaImage($aPath){
putenv('GDFONTPATH=' .dirname(__FILE__));
// quelques variables
$font = 'ArialRoundedBold';
$fontSize = 20;
$imgHeight = 100;
$txt = 'Pope';
$box = imagettfbbox($fontSize, 0, $font, $txt);
// créer l'image
$img = imagecreatetruecolor(500, $imgHeight);
imagefill($img, 0, 0, imagecolorallocate($img, 250, 250, 250));
imageantialias($img, true);
// dessine une ligne à 50 pixels
$color = imagecolorallocate($img, 180, 180, 180);
imageline($img, 0, $imgHeight/2, 500, $imgHeight/2, $color);
// couleur du texte
$color = imagecolorallocate($img, 0, 0, 0);
// #1
// affiche le texte à 50 pixels
imagestring($img, 6, 20, $imgHeight/2, $txt, $color);
// #2
// affiche le texte TTF à 50 pixels
imagettftext($img, $fontSize, 0, 100, $imgHeight/2, $color, $font, $txt);
// #3
// affiche le bas du texte TTF à 50 pixels
imagettftext($img, $fontSize, 0, 190, $imgHeight/2-(abs($box[1])), $color, $font, $txt);
// #4
// affiche le haut du texte TTF à 50 pixels
imagettftext($img, $fontSize, 0, 280, $imgHeight/2+(abs($box[7])), $color, $font, $txt);
// #5
// affiche le texte TTF centré à 50 pixels
imagettftext($img, $fontSize, 0, 370, $imgHeight/2-(abs($box[1])-abs($box[7]))/2, $color, $font, $txt);
// enregistre l'image sur le disque
imagepng($img, $aPath);
imagedestroy($img);
}
CaptchaImage('position.png');
$h = '<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Différence de positionnement entre imagestring() et imagettftext()</title></head><body>';
$h .= '<h1>Code</h1>';
$h .= '<img src="position.png" width="500" height="100" alt="" />';
$h .= '</body></html>';
echo $h;
?>
Ce code donne le résultat suivant :
Vous n'avez plus qu'à choisir la méthode de calcul qui vous convient :
- #2 : $imgHeight/2
- #3 : $imgHeight/2-(abs($box[1]))
- #4 : $imgHeight/2+(abs($box[7]))
- #5 : $imgHeight/2-(abs($box[1])-abs($box[7]))/2
La fonction imagettfbbox() renvoie des données négatives, c'est pour ça qu'il faut utiliser la valeur absolue de chaque coordonnée.
Ordre des coordonnées de imagettfbbox
Pour connaître la dimension d'un ou plusieurs caractères vous devez utiliser la fonction imagettfbbox().
Voici l'ordre des coordonnées du rectangle qui entourent le texte tel qu'ils sont renvoyés par la fonction imagettfbbox().
$box = imagettfbbox(30, 0, 'ArialRoundedBold', 'Ma typo TTF');
Ne vous trompez pas si vous ne voulez pas avoir des résultats étranges !