我正在尝试使用下面的函数将文本环绕在曲线上。但是,这没有考虑将文本居中对齐,无论文本有多宽。为了解决这个问题,我使用装订框计算了文本的宽度。
$type_space=imagettfbbox($fontSize, 0, $fontname, $text);
$image_width = abs($type_space[4] - $type_space[0]) + 10;
但是,由此,我需要找到一种方法,它可以根据宽度调整开始
$angle
。我尝试过很多设置,但似乎找不到正确的数学。任何帮助都会很棒,谢谢!
曲线函数
function imagettftextarc($image, $size, $angle, $x, $y, $r, $color, $fontfile, $text, $dir=false){
$sbox=imagettfbbox($size, 0, $fontfile, ' ');
$sbox=($sbox[2]-$sbox[0])*0.1;
$angle=$angle*M_PI/180;
foreach(preg_split('//u', $text) AS $t){
$px=$x+$r*cos($angle);
$py=$y+$r*sin($angle);
$dirangle=(360-(M_PI/2+$angle)*180/M_PI+($dir?180:0))%360;
imagettftext($image, $size, $dirangle, $px, $py, $color, $fontfile, $t);
$box=imagettfbbox($size, 0, $fontfile, $t);
$dx=$box[2]-$box[0];
$da=abs(asin(($dx+$sbox)/$r));
if($dir){
$angle-=$da;
}else{
$angle+=$da;
}
}
}
可能的解决方案 我不确定如何执行此操作,但如果曲线是水平展开的完整 360 度圆,则可能可以计算出曲线的长度。然后将新宽度除以展开宽度,以创建与需要更改的度数相关的值。
我提出了一个基于周长和文本长度的解决方案。
function imagettftextarc($image, $size, $angle, $x, $y, $r, $color, $fontfile, $text, $dir=false){
$type_space=imagettfbbox($size, 0, $fontfile, $text);
$image_width = abs($type_space[4] - $type_space[0]) + 10;
$circumference = $r*M_PI*2;
$sbox=imagettfbbox($size, 0, $fontfile, ' ');
$sbox=($sbox[2]-$sbox[0])*0.1;
$angle=($angle-90)*M_PI/180;
$angle = $angle - $image_width/$circumference*M_PI;
foreach(preg_split('//u', $text) AS $t){
$px=$x+$r*cos($angle);
$py=$y+$r*sin($angle);
$dirangle=(360-(M_PI/2+$angle)*180/M_PI+($dir?180:0))%360;
imagettftext($image, $size, $dirangle, $px, $py, $color, $fontfile, $t);
$box=imagettfbbox($size, 0, $fontfile, $t);
$dx=$box[2]-$box[0];
$da=abs(asin(($dx+$sbox)/$r));
if($dir){
$angle-=$da;
}else{
$angle+=$da;
}
}
}