Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does "imagettfbbox()" in PHP work?

Tags:

php

gd

Could you please explain what exactly the return value of imagettfbbox() mean? The manual says:

imagettfbbox() returns an array with 8 elements representing four points making the bounding box of the text on success and FALSE on error. [...Table of points here...] 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.

But, I found it not very clear. For example, the return value:

array(-1, 1, 61, 1, 61, -96, -1, -96)

means the following points:

(-1, -96) ------ (61, -96)
    |                |
    |                |
    |                |
    |                |
    |                |
    |                |
 (-1, 1) -------- (61, 1)              

How should I interpret them?

Why there are negative values?

like image 805
Misha Moroshko Avatar asked Sep 09 '12 09:09

Misha Moroshko


2 Answers

The following resource explains this: http://www.tuxradar.com/practicalphp/11/2/6 (via archive.org)

Just use abs(). This is from the resource above: "[the function] returns its values from the lower-left corner of the baseline of the text string, not the absolute lower-left corner. The baseline of a letter is where it would sit if you were hand writing it on lined paper"

like image 82
rationalboss Avatar answered Nov 16 '22 19:11

rationalboss


You should take a look at the comment by "marclaz" on the imagettfbbox manual page :

Please note that as imageTTFBbox and imageTTFText functions return an array of coordinates which could be negative numbers care must be taken with height and width calculations.

The rigth way to do that is to use the abs() function:

for an horizontal text:

$box = @imageTTFBbox($size,0,$font,$text); $width = abs($box[4] -
$box[0]); $height = abs($box[5] - $box[1]);

Then to center your text at ($x,$y) position the code should be like that:

$x -= $width/2; $y += $heigth/2;

imageTTFText($img,$size,0,$x,$y,$color,$font,$text);

this because (0,0) page origin is topleft page corner and (0,0) text origin is lower-left readable text corner.

like image 25
Alain Tiemblo Avatar answered Nov 16 '22 19:11

Alain Tiemblo