ID: 21560
Comment by: jtopland at hive dot no
Reported By: ljpersson at hotmail dot com
Status: Wont fix
Bug Type: GD related
Operating System: SusE 8.0,SuSE 8.2
PHP Version: 4.3.1-dev, 4.3.2RC2, 4.3.2RC3
Assigned To: pajoye
New Comment:
Here's a fixed version of imagettfbbox().
All angles returns correct values.
Except that imagettftext() returns different trackings (space between
each character) when rotating.
<?php
// Set some test variables
$font = "d://www//tahoma.ttf";
$text = "Finally, I can center rotated text!";
$size = 20;
$angle = 20;
// Create an image and fill the background with lightgray
$image = imagecreatetruecolor(500, 400);
imagefill($image, 0, 0, hexdec("dddddd"));
// Make a cross to make it easier to analyze
imageline($image, 0, 0, imagesx($image), imagesy($image),
hexdec("000000"));
imageline($image, imagesx($image), 0, 0, imagesy($image),
hexdec("000000"));
// Run a fixed version of imagettfbbox()
$bbox = imagettfbbox_fixed($size, $angle, $font, $text);
// Make some text and center the text on the image.
// imagettftext() pivot is on lower left
imagettftext($image, $size, $angle, imagesx($image) / 2 -
$bbox['width'] / 2, imagesy($image) / 2 + $bbox['height'] / 2,
hexdec("0000ff"), $font, $text);
// Show the image
imagepng($image);
function imagettfbbox_fixed($size, $angle, $font, $text)
{
// Get the boundingbox from imagettfbbox(), which is correct when
angle is 0
$bbox = imagettfbbox($size, 0, $font, $text);
// Rotate the boundingbox
$angle = pi() * 2 - $angle * pi() * 2 / 360;
for ($i=0; $i<4; $i++)
{
$x = $bbox[$i * 2];
$y = $bbox[$i * 2 + 1];
$bbox[$i * 2] = cos($angle) * $x - sin($angle) * $y;
$bbox[$i * 2 + 1] = sin($angle) * $x + cos($angle) * $y;
}
// Variables which tells the correct width and height
$bbox['width'] = $bbox[0] + $bbox[4];
$bbox['height'] = $bbox[1] - $bbox[5];
return $bbox;
}
?>
Previous Comments:
------------------------------------------------------------------------
[2003-08-11 14:39:37] [EMAIL PROTECTED]
There are BC issues with FT1 support in gd. The code requires deep
changes to solve this issue.
pierre
------------------------------------------------------------------------
[2003-07-20 03:29:03] kyle at putnamcabinets dot com
I've upgraded to PHP 4.3.3RC1 and the problem still exists. Maybe a
problem with GD? I've reported the bug to boutell.com and haven't
recieved a response in over three weeks. An exmple of this bug at work
(problem with imagettfbbox and imagettftext):
http://webdev.quiteuseless.com/damn-gd-ttf-bugs/test.php
------------------------------------------------------------------------
[2003-06-24 01:33:35] kyle at putnamcabinets dot com
I also experience the problem with PHP 4.3.2 and bundled GD version
'2.0.12 compatible'. Recompiled with Debian package version
(2.0.12-2... damn!) and same problem (obviously). It seems to be some
how proportional to the angle of the text; smaller angles yield more
accuracy.
My implementation:
<?
$res = imagecreatetruecolor(400, 400);
$white = imagecolorallocate($res, 0xff, 0xff, 0xff);
$red = imagecolorallocate($res, 0xcc, 0x00, 0x00);
$blue = imagecolorallocate($res, 0x00, 0x00, 0xcc);
imagefill($res, 0, 0, $white);
for ($angle = 0; $angle < 360; $angle += 60)
{
$wrong1 = imagettftext($res,20,$angle,200,200,$blue,
"/usr/share/fonts/truetype/Courier_New.ttf",
"ABCDEF 12345");
$t = imagettfbbox(20, $angle,
"/usr/share/fonts/truetype/Courier_New.ttf",
"ABCDEF 12345");
$wrong2 = array(200+$t[0],200+$t[1],200+$t[2],
200+$t[3],200+$t[4],200+$t[5],200+$t[6],200+$t[7]);
imagepolygon($res,$wrong2,count($wrong2)/2,$red);
imagepolygon($res,$wrong1,count($wrong1)/2,$red);
}
header("Content-type: image/png");
imagepng($res);
?>
------------------------------------------------------------------------
[2003-06-18 03:03:12] guno at guno dot nl
I'm experiencing the same problem, using php 4.3.2 with GD 2.0.15
Normal text (with no rotation) results in a correct bounding box, but
as soon as I rotate the text, it goes wrong, no matter which font I
use.
Here's a sample code which displays a text with it's bounding box at 0,
90, 180 and 170 degrees:
<?php
$image=imagecreate(500, 500);
$imagedum=imagecreate(500, 500);
$color1=imagecolorallocate($image, 0xff, 0xff, 0xff);
$color2=imagecolorallocate($image, 0x3f, 0x3f, 0x3f);
$color3=imagecolorallocate($image, 0xff, 0x00, 0x00);
for ($angle=0; $angle<360; $angle+=90) {
$text="ABCpqrs";
$font = "./verdana.ttf";
// Draw the text into the image:
$result=imagettftext($imagedum, 30, $angle, 250, 250, $color2,
$font, $text);
imagettftext($image, 30, $angle, 250, 250, $color2,
$font, $text);
// Draw the bounding-box into the image:
imageline($image, $result[0], $result[1], $result[2], $result[3],
$color3);
imageline($image, $result[2], $result[3], $result[4], $result[5],
$color3);
imageline($image, $result[4], $result[5], $result[6], $result[7],
$color3);
imageline($image, $result[6], $result[7], $result[0], $result[1],
$color3);
}
// Draw the image to the screen:
header("Content-Type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
imagedestroy($imagedum);
?>
------------------------------------------------------------------------
[2003-05-16 19:37:07] ljpersson at hotmail dot com
Just checked with 4.3.2RC3 and the problem still exists.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/21560
--
Edit this bug report at http://bugs.php.net/?id=21560&edit=1