imagettftext

(PHP 4, PHP 5, PHP 7, PHP 8)

imagettftextDessine un texte avec une police TrueType

Description

imagettftext(
    GdImage $image,
    float $size,
    float $angle,
    int $x,
    int $y,
    int $color,
    string $font_filename,
    string $text,
    array $options = []
): array|false

imagettftext() dessine le texte text avec la police TrueType fontfile.

Note:

Antérieur à PHP 8.0.0, imagefttext() était une variante étendue de imagettftext() qui en plus supporte extrainfo. À partir de PHP 8.0.0, imagettftext() est un alias de imagefttext().

Liste de paramètres

image

Un objet GdImage, retournée par une des fonctions de création d'images, comme imagecreatetruecolor().

size

La taille de la police de caractères en point.

angle

L'angle, en degrés ; 0 degré correspond à la lecture du texte de gauche à droite. Les valeurs positives représentent une rotation dans le sens contraire des aiguilles d'une montre. Par exemple, une valeur de 90 correspondra à une lecture du texte de bas en haut.

x

Les coordonnées données par x et y définiront la position du premier caractère (le coin bas-gauche du caractère). Cela est différent de la fonction imagestring(), où x et y définissent le coin haut-gauche du premier caractère. Par exemple, "haut gauche" correspond à 0, 0.

y

L'ordonnée Y. Cela définit la position de la ligne de base de la police, et non pas le bas des caractères.

color

L'index de la couleur. Utiliser un index de couleur négatif désactivera l'antialiasing. Voir la fonction imagecolorallocate().

fontfile

Le chemin d'accès à la police TrueType que vous souhaitez utiliser.

Selon la version de la bibliothèque GD que PHP utilise, quand fontfile ne commence pas par une premier / alors .ttf sera ajouté au nom de fichier et la bibliothèque essaiera de rechercher ce nom de fichier le long d'un chemin de police défini par la bibliothèque.

Lorsque vous utilisez des versions de la bibliothèque GD inférieure à 2.0.18, un caractère espace, plutôt qu'un point-virgule, a été utilisé comme séparateur de chemin d'accès pour différents fichiers de police. L'utilisation involontaire de cette fonctionnalité se traduira par le message d'avertissement: Avertissement: impossible de trouver/ouvrir la police. Pour ces versions affectées, la seule solution consiste à déplacer la police vers un chemin qui ne contient pas d'espaces.

Dans de nombreux cas où une police réside dans le même répertoire que le script en l'utilisant l'astuce suivante permettra d'atténuer les problèmes d'inclusion.

<?php
// Définir la variable d'environnement pour GD
putenv('GDFONTPATH=' . realpath('.'));

// Nommez la police à utiliser (Notez l'absence de l'extension .ttf)
$font = 'SomeFont';
?>

Note:

Notez que open_basedir ne s'applique pas à fontfile.

text

La chaîne de texte, en UTF-8.

Peut inclure des références à des caractères numériques, décimales (sous la forme : &#8364;) pour accéder aux caractères d'une police au delà du premier 127. Le format hexadécimal (comme &#xA9;) est pris en charge. Les chaînes de caractères encodées en UTF-8 peuvent être passées directement.

Les entités nommées, comme &copy;, ne sont pas supportées. Utilisez la fonction html_entity_decode() pour encoder ces entités nommées en chaîne UTF-8.

Si un caractère est utilisé dans une chaîne qui n'est pas supportée par la police, un rectangle creux remplacera le caractère.

options

Un tableau avec une clé linespacing contenant une valeur float.

Valeurs de retour

Retourne un tableau de 8 éléments représentant quatre points marquants les limites du texte. L'ordre des points est : inférieur gauche, inférieur droit, supérieur droit, supérieur gauche. Les points sont relatifs au texte par rapport à l'angle, donc, "supérieur gauche" signifie dans le coin en haut à gauche lorsque vous regardez le texte horizontalement. Retourne false si une erreur survient.

Historique

Version Description
8.0.0 Le paramètre options a été ajouté.

Exemples

Exemple #1 Exemple avec imagettftext()

Cet exemple produira une image PNG blanche de 400x30 pixels, avec le texte "Test..." en noir, avec une ombre grise, utilisant la police Arial.

<?php

// Définition du content-type
header('Content-Type: image/png');

// Création de l'image
$im = imagecreatetruecolor(400, 30);

// Création de quelques couleurs
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);

// Le texte à dessiner
$text = 'Test...';

// Remplacez le chemin par votre propre chemin de police
$font = 'arial.ttf';

// Ajout d'ombres au texte
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);

// Ajout du texte
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

// Utiliser imagepng() donnera un texte plus claire,
// comparé à l'utilisation de la fonction imagejpeg()
imagepng($im);

?>

Résultat de l'exemple ci-dessus est similaire à :

Affichage de l'exemple : imagettftext()

Notes

Note: Cette fonction n'est disponible que si si PHP est compilé avec le support Freetype (--with-freetype-dir=DIR)

Voir aussi

  • imagettfbbox() - Retourne le rectangle entourant un texte et dessiné avec une police TrueType
  • imagefttext() - Écrit du texte dans une image avec la police courante FreeType 2
  • imagestring() - Dessine une chaîne horizontale
add a note

User Contributed Notes 7 notes

up
52
Valentijn de Pagter
17 years ago
If you're looking for easy text alignment, you need to use the imagettfbbox() command. When given the correct parameters, it will return the boundaries of your to-be-made text field in an array, which will allow you to calculate the x and y coordinate that you need to use for centering or aligning your text.

A horizontal centering example:

<?php

$tb = imagettfbbox(17, 0, 'airlock.ttf', 'Hello world!');

?>

$tb would contain:

Array
(
    [0] => 0 // lower left X coordinate
    [1] => -1 // lower left Y coordinate
    [2] => 198 // lower right X coordinate
    [3] => -1 // lower right Y coordinate
    [4] => 198 // upper right X coordinate
    [5] => -20 // upper right Y coordinate
    [6] => 0 // upper left X coordinate
    [7] => -20 // upper left Y coordinate
)

For horizontal alignment, we need to substract the "text box's" width { $tb[2] or $tb[4] } from the image's width and then substract by two.

Saying you have a 200px wide image, you could do something like this:

<?php

$x = ceil((200 - $tb[2]) / 2); // lower left X coordinate for text
imagettftext($im, 17, 0, $x, $y, $tc, 'airlock.ttf', 'Hello world!'); // write text to image

?>

This'll give you perfect horizontal center alignment for your text, give or take 1 pixel. Have fun!
up
12
suyog at suyogdixit dot com
12 years ago
For your general edification: The following drop-in function will place a block of fully justified text onto a GD image. It is a little CPU heavy, so I suggest caching the output rather than doing it on-the-fly. 

Arguments: 

$image - the GD handle of the target canvas 
$size - text size 
$angle - slope of text (does not work very well), leave at 0 for horizontal text 
$left - no. of pixels from left to start block 
$top - no. of pixels from top to start block 
$color - handle for colour (imagecolorallocate result) 
$font - path to .ttf font 
$text - the text to wrap and justify 
$max_width - the width of the text block within which the text should be wrapped and fully justified 
$minspacing - the minimum number of pixels between words 
$linespacing - a multiplier of line height (1 for normal spacing; 1.5 for line-and-a-half etc.)

eg.
$image = ImageCreateFromJPEG( "sample.jpg" );
$cor = imagecolorallocate($image, 0, 0, 0);
$font = 'arial.ttf';
$a = imagettftextjustified($image, 20, 0, 50, 50, $color, $font, "Shree", 500, $minspacing=3,$linespacing=1);
header('Content-type: image/jpeg');
imagejpeg($image,NULL,100);

function imagettftextjustified(&$image, $size, $angle, $left, $top, $color, $font, $text, $max_width, $minspacing=3,$linespacing=1)
{
$wordwidth = array();
$linewidth = array();
$linewordcount = array();
$largest_line_height = 0;
$lineno=0;
$words=explode(" ",$text);
$wln=0;
$linewidth[$lineno]=0;
$linewordcount[$lineno]=0;
foreach ($words as $word)
{
$dimensions = imagettfbbox($size, $angle, $font, $word);
$line_width = $dimensions[2] - $dimensions[0];
$line_height = $dimensions[1] - $dimensions[7];
if ($line_height>$largest_line_height) $largest_line_height=$line_height;
if (($linewidth[$lineno]+$line_width+$minspacing)>$max_width)
{
$lineno++;
$linewidth[$lineno]=0;
$linewordcount[$lineno]=0;
$wln=0;
}
$linewidth[$lineno]+=$line_width+$minspacing;
$wordwidth[$lineno][$wln]=$line_width;
$wordtext[$lineno][$wln]=$word;
$linewordcount[$lineno]++;
$wln++;
}
for ($ln=0;$ln<=$lineno;$ln++)
{
$slack=$max_width-$linewidth[$ln];
if (($linewordcount[$ln]>1)&&($ln!=$lineno)) $spacing=($slack/($linewordcount[$ln]-1));
else $spacing=$minspacing;
$x=0;
for ($w=0;$w<$linewordcount[$ln];$w++)
{
imagettftext($image, $size, $angle, $left + intval($x), $top + $largest_line_height + ($largest_line_height * $ln * $linespacing), $color, $font, $wordtext[$ln][$w]);
$x+=$wordwidth[$ln][$w]+$spacing+$minspacing;
}
}
return true;
}
up
5
gav-alex at bk dot ru
20 years ago
Hi all!
When my hoster updated his php's libs at first minutes i've got the same problem as some of you.
Php couldn't find the path to true type fonts.
The solution in my case was to make the path look like this
<?php
imagettftext($im, 20, 0, 620, 260, $secondary_color, "./tahoma.ttf" , "NEWS");
?>
so as you can see i simply added "./"

another tip that i wanted to add here is how to write in RUssian on image using imagettftext
you simply have to change the function argument like this
<?php
imagettftext($im, 15, 0, 575, 300, $secondary_color, "./tahoma.ttf" , win2uni("some word in russian"));
 ?>
where win2uni is the function that converts win1251 to unicode. here is the code of it
<?php 

  //  Windows 1251 -> Unicode
  function win2uni($s)
  {
    $s = convert_cyr_string($s,'w','i'); //  win1251 -> iso8859-5
    //  iso8859-5 -> unicode:
    for ($result='', $i=0; $i<strlen($s); $i++) {
      $charcode = ord($s[$i]);
      $result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
    }
    return $result;
  }
?>

That's all today! Thanks for your attention!
Alex
up
2
mitch at electricpulp dot com
18 years ago
If you're having issues with fonts not working... (Could not find/open font) check your permissions on the folder/font files and make sure they're 775, especially if you've just pulled them from a windows box. Hope this helps!
up
2
s.pynenburg _at_ gm ail dotcom
17 years ago
I had an image generator where the user could position where they wanted the text to begin - however it kept going off the side of an image. So I made this basic function: it measures if the inputted text and x-position will cause the string to go off the edge, and if so, it will fit as much as it can on the first line, then go down to the next one.
Limitations:
-It only performs this once (i.e. it won't split into three lines)
-I'm pretty sure it won't work with angled text.

<?PHP

function imagettftextwrap($im, $size, $angle, $x_pos, $y_pos, $color, $font, $instr)
{
    $box = @imagettfbbox($size, 0, $font, $instr);
    $width = abs($box[4] - $box[0]);
    $height = abs($box[3] - $box[5]);
    $overlap = (($x_pos + $width) - imagesx($im));
    if($overlap > 0) //if the text doesn't fit on the image
    {
        $chars = str_split($instr);
        $str = "";
        $pstr = "";
        for($m=0; $m < sizeof($chars); $m++)
        {
            $bo = imagettfbbox($fsize1, 0, $font1, $str);
            $wid = abs($bo[4] - $bo[0]);
            if(($x_pos + $wid) < imagesx($im)) //add one char from the string as long as it's not overflowing
            {
                $pstr .= $chars[$m];
                $bo2 = imagettfbbox($fsize1, 0, $font1, $pstr);
                $wid2 = abs($bo2[4] - $bo2[0]);
                if(($x_pos + $wid2) < imagesx($im))
                {
                    $str .= $chars[$m];
                }    
                else
                {
                    break;
                }
            }
            else
            {
                break;
            }
        }
        $restof = "";
        for($l=$m; $l < sizeof($chars); $l++)
        {
            $restof .= $chars[$l]; //add the rest of the string to a new line
        }
        imagettftext($im, $size, $angle, $x_pos, $y_pos, $color, $font, $str); // print out the smaller line
        imagettftext($im, $size, $angle, 0, $y_pos + $height, $color, $font, $restof); //and the rest of it
    }
    else
    {
        imagettftext($im, $size, $angle, $x_pos, $y_pos, $color, $font, $instr); //otherwise just do normally
    }

}

?>
up
3
pillepop2003 at nospam dot yahoo dot de
21 years ago
Hey guys,

check this function if you want to rotate the text around its center and not its "lower left" pivot-point:

<?php
        // Put center-rotated ttf-text into image
        // Same signature as imagettftext();
        function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text)
        {
            // retrieve boundingbox
            $bbox = imagettfbbox($size, $angle, $fontfile, $text);
            
            // calculate deviation
            $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0;         // deviation left-right
            $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0;        // deviation top-bottom
            
            // new pivotpoint
            $px = $x-$dx;
            $py = $y-$dy;
            
            return imagettftext($im, $size, $angle, $px, $py, $color, $fontfile, $text);
        }

?>

Big up
Phil
up
3
philip at webdesco dot com
16 years ago
Hi,
for the dummies (like myself) if you are having problems including your font file, prefix the file name with ./

On my development server the following worked fine
$myfont = "coolfont.ttf";

on my hosting server the only way i could get the font to work was as follows
$myfont = "./coolfont.ttf";

hope this helps someone out!
To Top