PHP 8.4.1 Released!

imageftbbox

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

imageftbboxCalcule le rectangle d'encadrement pour un texte, en utilisant la police courante et freetype2

Description

imageftbbox(
    float $size,
    float $angle,
    string $font_filename,
    string $string,
    array $options = []
): array|false

imageftbbox() calcule le rectangle d'encadrement pour le texte text, en utilisant la police courante et freetype2.

Note:

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

Liste de paramètres

size

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

angle

Angle, en degrés, dans lequel le paramètre string sera mesuré.

font_filename

Le nom du fichier de la police TrueType (peut être une URL). Suivant la version de GD utilisée par PHP, il sera recherché les fichiers qui ne commencent pas par un '/', en y ajoutant l'extension '.ttf', et suivant le chemin des polices défini par la bibliothèque.

string

La chaîne à mesurer.

options

Index possibles pour le tableau options
Clé Type Signification
linespacing float Représente l'espacement entre les lignes lors du dessin

Valeurs de retour

imageftbbox() retourne un tableau contenant 8 éléments représentant les 4 points du rectangle entourant le texte :

0 Coin en bas, à gauche, position en X
1 Coin en bas, à gauche, position en Y
2 Coin en bas, à droite, position en X
3 Coin en bas, à droite, position en Y
4 Coin en haut, à droite, position en X
5 Coin en haut, à droite, position en Y
6 Coin en haut, à gauche, position en X
7 Coin en haut, à gauche, position en Y

Les points sont relatifs au texte suivant le paramètre angle, aussi, "en haut à gauche" signifie le coin en haut à gauche lorsque l'on regarde le texte horizontalement.

En cas d'échec, false est retourné.

Exemples

Exemple #1 Exemple avec imageftbbox()

<?php
// Création d'une image de 300x150 pixels
$im = imagecreatetruecolor(300, 150);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);

// Définit l'arrière-plan en blanc
imagefilledrectangle($im, 0, 0, 299, 299, $white);

// Chemin vers notre fichier de police
$font = './arial.ttf';

// D'abord, nous créons un rectangle contenant notre texte
$bbox = imageftbbox(10, 0, $font, 'The PHP Documentation Group');

// Nos coordonnées en X et en Y
$x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) - 5;
$y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;

imagefttext($im, 10, 0, $x, $y, $black, $font, 'The PHP Documentation Group');

// Affichage vers le navigateur
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

Notes

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

Voir aussi

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

User Contributed Notes 8 notes

up
2
fernando
19 years ago
imagettfbbox() returns an array with 8 elements representing four points making the bounding box of the text:

0 lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle, so "upper left" means in the top left-hand corner seeing the text horizontally.
up
1
phpimageftbbox at juggernaut dot com dot au
22 years ago
This function can be used to generate right-aligned text. Just work out how wide the text image is and position it accordingly. Example:

$i_width = 200;
$i_height = 40;

$string = "Hello World!";
$pointsize = 10;
$fontfile = "/usr/local/lib/ttf/Helve.ttf";

$im = imagecreate($i_width, $i_height);
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);

$string_size = ImageFtBbox($pointsize, 0, $fontfile, $string, array("linespacing" => 1));
$s_width = $string_size[4];
$s_height = $string_size[5];

ImageFtText($im, $pointsize, 0, $i_width - $s_width - 1, 0 - $s_height, $white, $fontfile, $string, array("linespacing" => 1));

Header ("Content-type: image/png");
ImagePNG ($im);
ImageDestroy ($im);
up
1
sectionthirty1 at yahoo dot com
20 years ago
Here is a handy example I used to center "dynamic text" onto an image.

Ex. Say you want to center a clients IP Address onto a picture.

$ip=$_SERVER['REMOTE_ADDR'];

$details = imageftbbox($fontsize, 0, $font, $ip, array("linespacing" => 1));

$xcoord = ($imgwidth - $details[4]) / 2; // this will return the x coordinate centered to your specific image. Make sure you set $imgwidth to the width of the image you are using.

imagettftext($image, $fontsize, 0, $xcoord, $ycoord, $fontcolor, $font, $ip);
up
0
theo v e -2
18 years ago
ah... the problem between imageftbbox() and imagefttext() lies in the mirroring of the y-axes.
Below you see, for a font-size 16 the boudingboxes of "b", "p" and "bp":
< b: w=9 h=15
b(0,-1)
b(9,-1)
b(9,-16)
b(0,-16)
< p: w=9 h=16
p(0,4)
p(9,4)
p(9,-12)
p(0,-12)
< bp: w=20 h=20
bp(0,4)
bp(20,4)
bp(20,-16)
bp(0,-16)
If drawing "bp" using imagefttext() at y=0, the the top of "bp" indeed is at y=-16, and the bottom of "bp" at y=4. (Plus or minus a pixel here and there, because at y=0 there actually is a vissible pixel.)
up
-1
pablocorezzola at gmail dot com
7 years ago
//EXAMPLE - Center text

function newText($im, $size, $angle= 0, $x, $y, $color, $font, $text,$align = "left",$border=false,$width=0,$height=0){

if($align == "center")
{
if ($border == true ){
imagerectangle($im, $x, $y, $x +$width, $y + $height, $color);
}
$bbox = imageftbbox($size, 0, $font, $text);

// Marcamos el ancho y alto
$s_width = $bbox[4];
$s_height = $bbox[5];

$y = $y + ($height-$s_height)/2;
$x = $x + ($width-$s_width)/2;

}

imagettftext($im, $size, $angle, $x, $y, $color, $font, $text);
}
up
-1
Johan
17 years ago
For alignment i used this method:

if($align == "center" || $align == "right")
{
$verticaltxtspace = $backwidth - (2 * $posx);
$spacepositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", " ");
$spacepx = $spacepositions[4] - $spacepositions[0];

// Split text in lines
$lines = split("[\r][\n]", $text);
for($count = 0; $count < count($lines); $count++)
{
$textpositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", $lines[$count]);
$textpx = $textpositions[2] - $textpositions[0];

if($align == "right")
{
$spaces = ($verticaltxtspace - $textpx) / $spacepx;
}
else if($align == "center")
{
$spaces = (($verticaltxtspace - $textpx)/2) / $spacepx;
}

// Add spaces
$line = $lines[$count];
for($i = 0; $i < $spaces; $i++)
{
$line = " " . $line;
}
$lines[$count] = $line;
}

// Create new text of lines
$text = "";
for($count = 0; $count < count($lines); $count++)
{
$text .= $lines[$count] . "\r\n";
}
}


// Draw the shadow text on de shadow
imagettftext($background, $size, $angle, $posx, $posy, $textcolor, "fonts/verdanaz.ttf", $text);
up
-2
ta at NOSPAM dot magicsquare dot info
22 years ago
i've found a work around for this situation

it seems that height is directly proportional to line spacing so you just have to apply the same factor to image height

for example :

$spacing = 0.7;
$params = array("linespacing" => $spacing);

$box = imageftbbox ($size, 0, $font, $text, $params);
$tw=$box[4]-$box[0]; //image width
$th=($box[1]-$box[5])*$spacing; //image height
up
-3
groomed at users dot sf dot net
20 years ago
ImageFTBBox returns a bounding box, not metrics, as some (most?) of the notes above seem to assume. The 8 values it returns specify the 4 corners of this bounding box. So to properly determine the width and height of a string you need to do:

$bbox = ImageFTBBox(...);
$width = abs($bbox[0]) + abs($bbox[2]); // distance from left to right
$height = abs($bbox[1]) + abs($bbox[5]); // distance from top to bottom
To Top