PHP GD如何在一行上绘制文本

Posted

技术标签:

【中文标题】PHP GD如何在一行上绘制文本【英文标题】:PHP GD how to draw text over a line 【发布时间】:2013-02-15 11:46:21 【问题描述】:

最终输出应该像图像(HELLO WORLD):

这是我正在做的:-

$im = imagecreate(400,400); 

$txtcol = imagecolorallocate($im, 0xFF, 0x00, 0x00);

$size = 20;

$txt = 'DUMMY TEXT';

$font = './font/Capriola-Regular.ttf';

/*two points for base line*/

$x1 = 50; $x2 = 300; 

$y1 = 150; $y2 = 170;

/*bof finding line angle*/

$delta_x = $x2-$x1;

$delta_y = $y2-$y1;

$texangle = (rad2deg(atan2($delta_y,$delta_x)) * 180 / M_PI)-360;

/*eof finding the line angle*/


imageline($im,$x1,$y1,$x2,$y2,$txtcol); //Drawing line

imagettftext($im, $size, $texangle, $x1, $y1, $txtcol, $font, $txt); // Drawing text over line at line's angle

而当前的输出是这样的:

谁能告诉我的代码有什么问题?

谢谢

【问题讨论】:

$tyimagettftext 中定义在哪里? 抱歉,不是 $ty 它的 $y1 @webnoob 感谢您通知我 :) 我认为问题在于找到线的角度。你怎么看@webnoob 是的,那条线引起了问题。我目前无法对其进行测试,所以如果不直接运行代码就帮不上什么忙了。 @Robin:尝试给出角度(-)eve值并检查 【参考方案1】:

好的,一直在玩。尝试替换:

$texangle = (rad2deg(atan2($delta_y,$delta_x)) * 180 / M_PI)-360;

与:

$texangle = (atan2($delta_y,$delta_x) * -180 / M_PI)-360;

输出你的价值观:

其他值的输出:

【讨论】:

【参考方案2】:

2 个想法,目前无法测试。

    哪里是 0 (x=1, y=0) 或 (x=0, y=1)。看来你的文字差了 90 度数,这通常意味着您假设 0 是正确的, 当它可能直接上升时,反之亦然。

    (rad2deg(atan2($delta_y,$delta_x)) * 180 / M_PI)-360; 你在这里做双重工作吗? rad2deg 从弧度转换为度数。 180 / M_PI 也是弧度到度数的转换。

【讨论】:

【参考方案3】:

这不是您可能正在寻找的确切内容,但我相信它会对您有所帮助

$im = imagecreate(400,400); 

$txtcol = imagecolorallocate($im, 0xFF, 0xFF, 0x00);

$size = 20;

$txt = 'DUMMY TEXT';

$font = 'Capriola-Regular.ttf';

/*two points for base line*/

$x1 = 70; $x2 = 170; 

$y1 = 140; $y2 = 240;

/*bof finding line angle*/

$delta_x = $x2-$x1;

$delta_y = $y2-$y1;

$texangle = (rad2deg(atan2($delta_y,$delta_x)) * 180 / M_PI)-360;

/*eof finding the line angle*/


imageline($im,$x1,$y1,$x2,$y2,'0xDD'); //Drawing line
imagettftext($im, $size, -45, $x1, $y1-10, '0xDD', $font, $txt); // Drawing text over line at line's angle

header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);

值是硬编码的。 此处角度为 -45,对于该角度,如果您希望文本出现在线条上方,则必须从线条的初始 Y 位置减小值。 你将不得不编写代码来计算与线的 x1,x2y1,y2 的角度

【讨论】:

那行得通。最初我正在测试,所以我采用硬编码值。现在的问题是,如果我们动态提供 Line 的坐标,那么我们将如何找到 imagettftext 的角度和 Y 的 REDUCED 值? @Robin:我认为 webnoob 的解决方案应该可以工作。不过我还没有测试过

以上是关于PHP GD如何在一行上绘制文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 的 GD 库中为文本添加发光或阴影? [关闭]

PHP系列GD库

如何使用 PHP GD 将文本写入不同大小的图像

拉伸由 GD 创建的图像文本

使用透明背景的 GD 绘制文本

PHP GD 在另一个形状上绘制形状并使其透明