PHP 5.6.0 released

imageftbbox

(PHP 4 >= 4.0.7, PHP 5)

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

Description

array imageftbbox ( float $size , float $angle , string $fontfile , string $text [, array $extrainfo ] )

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

Liste de paramètres

size

La taille de la police de caractères. Suivant votre version de GD, elle doit être exprimée en pixel (GD1) ou en point (GD2).

angle

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

fontfile

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.

text

La chaîne à mesurer.

extrainfo

Index possibles pour le tableau extrainfo
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.

Exemples

Exemple #1 Exemple avec imageftbbox()

<?php
// Création d'une image de 300x150 pixels
$im imagecreatetruecolor(300150);
$black imagecolorallocate($im000);
$white imagecolorallocate($im255255255);

// Définit l'arrière-plan en blanc
imagefilledrectangle($im00299299$white);

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

// D'abord, nous créons un rectangle contenant notre texte
$bbox imageftbbox(100$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($im100$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 requiert la bibliothèque GD 2.0.1 ou supérieure (2.0.28 ou supérieure est recommandée).

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

Historique

Version Description
4.3.5 Le paramètre extrainfo est maintenant optionnel.

add a note add a note

User Contributed Notes 8 notes

up
0
theo v e -2
8 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
0
fernando
9 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
0
groomed at users dot sf dot net
10 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
up
0
sectionthirty1 at yahoo dot com
10 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
ta at NOSPAM dot magicsquare dot info
11 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
0
phpimageftbbox at juggernaut dot com dot au
12 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
Brian at PrintsMadeEasy dot com
11 years ago
I noticed that PHP's True Type functions do not allow you to create text blocks with multiple lines that automatically adjust for alignment.  I wrote a function that will allow you to generate images with multiple lines, control the alignment, and handle rotation.  I hope it helps someone.

There was too much code to paste on this message post so you can grab it off of my webserver.  I also created an example page so that you can see the code in action.

Example Page:
http://www.PrintsMadeEasy.com/code_samples/php/text_generation.php

Download the Text file:
http://www.PrintsMadeEasy.com /code_samples/php/text_generation.txt
up
-3
Johan
6 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);
To Top