Image de l'article Comment centrer correctement un texte avec imagettftext en PHP ?

Comment centrer correctement un texte avec imagettftext en PHP ?

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

différence de positionnement entre imagestring() et imagettftext()

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 :


<?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 :

positionnement

Vous n'avez plus qu'à choisir la méthode de calcul qui vous convient :

  1. #2 : $imgHeight/2
  2. #3 : $imgHeight/2-(abs($box[1]))
  3. #4 : $imgHeight/2+(abs($box[7]))
  4. #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');

rectangle de imagettfbbox() en PHP

Ne vous trompez pas si vous ne voulez pas avoir des résultats étranges !

Article précédent : Liste PHP des pays du monde

Article suivant : Un code de sécurité PHP pour vos formulaires, partie 2

 

Image Viewer