将文本放在曲线上居中,PHP GD

问题描述 投票:0回答:1

我正在尝试使用下面的函数将文本环绕在曲线上。但是,这没有考虑将文本居中对齐,无论文本有多宽。为了解决这个问题,我使用装订框计算了文本的宽度。

$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 度圆,则可能可以计算出曲线的长度。然后将新宽度除以展开宽度,以创建与需要更改的度数相关的值。

php html gd
1个回答
0
投票

我提出了一个基于周长和文本长度的解决方案。

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.