note 74686 added to function.imagettfbbox
| From: | ralphbolton at mail2sexy dot com | Date: | Mon, 23 Apr 2007 16:16:40 +0000 |
| Subject: | note 74686 added to function.imagettfbbox | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-125800@lists.php.net to get a copy of this message | ||
There's a bit of an annoyance with measuring font sizes and drawing boxes around text. When
fonts are measured using ImageTTFbbox, the correct vertical height is returned. That is, the
measurement of the phrase "Hanging" will be from the top of the "H" to the
bottom of the "g".
The problem is that functions like imageTTFtext align with the "line" of the text - that
is, in the phrase "Hanging", the alignment is below the "H", not the bottom of
the "g". That means that if you draw a rectangle behind your text, it'll be
incorrectly aligned because the hanging "g" will be outside the box.
For example, this doesn't work as you might expect (because the "g" hangs below the
box):
<?php
// Get the size of the font box
$textbox = imageTTFBbox($size, 0, $font, 'Hanging');
$textwidth = abs($textbox[4] - $textbox[0]);
$textheight = abs($textbox[5] - $textbox[1]);
// Now draw a rectangle on the image
$colour = ImageColorAllocate($im, 100, 100, 100);
imagefilledrectangle($im, $x, $y - $textheight, $x + $textwidth, $y, $colour );
// Now draw the text
$black = ImageColorAllocate($im, 0, 0, 0);
ImageTTFText($image['resource'], $size, 0, $x, $y, $black, $font, 'Hanging');
?>
It also seems that the rectangle in the above example is located 1 pixel to the left of the text.
I haven't found a way to resolve this problem correctly. Instead, I have enlarged the rectangle
and then put the text into it. I don't think this will work absolutely correctly for all fonts,
so it's not exactly a perfect solution. However, it's better than nothing! Here is a
snippet of it:
<?php
$enlargex = $textwidth * 0.08;
$enlargey = $textheight * 0.1;
$enlargey2 = $textheight * 0.5;
// Now draw a rectangle on the image
$colour = ImageColorAllocate($im, 100, 100, 100);
imagefilledrectangle($im, $x - $enlargex, $y - $textheight - $enlargey, $x + $textwidth + $enlargex,
$y + $enlarge2, $colour );
?>
----
Server IP: 194.145.210.3
Probable Submitter: 83.67.131.199
----
Manual Page -- http://www.php.net/manual/en/function.imagettfbbox.php
Edit -- https://master.php.net/note/edit/74686
Del: integrated -- https://master.php.net/note/delete/74686/integrated
Del: useless -- https://master.php.net/note/delete/74686/useless
Del: bad code -- https://master.php.net/note/delete/74686/bad+code
Del: spam -- https://master.php.net/note/delete/74686/spam
Del: non-english -- https://master.php.net/note/delete/74686/non-english
Del: in docs -- https://master.php.net/note/delete/74686/in+docs
Del: other reasons-- https://master.php.net/note/delete/74686
Reject -- https://master.php.net/note/reject/74686
Search -- https://master.php.net/manage/user-notes.php