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
而当前的输出是这样的:
谁能告诉我的代码有什么问题?
谢谢
【问题讨论】:
$ty
在imagettftext
中定义在哪里?
抱歉,不是 $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如何在一行上绘制文本的主要内容,如果未能解决你的问题,请参考以下文章