(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)
imageftbbox — Give the bounding box of a text using fonts via freetype2
$size,$angle,$font_filename,$string,$options = []This function calculates and returns the bounding box in pixels for a FreeType text.
Note:
Prior to PHP 8.0.0, imageftbbox() was an extended variant of imagettfbbox() which additionally supported the
options. As of PHP 8.0.0, imagettfbbox() is an alias of imageftbbox().
sizeThe font size in points.
angle
 Angle in degrees in which string will be 
 measured.
 
font_filenameThe name of the TrueType font file (can be a URL). Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading '/' by appending '.ttf' to the filename and searching along a library-defined font path.
stringThe string to be measured.
options
| Key | Type | Meaning | 
|---|---|---|
linespacing | 
 float | Defines drawing linespacing | 
imageftbbox() returns an array with 8 elements representing four points making the bounding box of the text:
 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.
 
 On failure, false  is returned.
 
Example #1 imageftbbox() example
<?php
// Create a 300x150 image
$im = imagecreatetruecolor(300, 150);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);
// Set the background to be white
imagefilledrectangle($im, 0, 0, 299, 299, $white);
// Path to our font file
$font = './arial.ttf';
// First we create our bounding box
$bbox = imageftbbox(10, 0, $font, 'The PHP Documentation Group');
// This is our cordinates for X and 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');
// Output to browser
header('Content-Type: image/png');
imagepng($im);
?>Note: This function is only available if PHP is compiled with freetype support (--with-freetype-dir=DIR)
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.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);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);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.)//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);
}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);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 heightImageFTBBox 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