Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php imagettftext字母间距_Php_Gd_Imagettftext - Fatal编程技术网

php imagettftext字母间距

php imagettftext字母间距,php,gd,imagettftext,Php,Gd,Imagettftext,是否有人有一个函数可以用指定的字母间距绘制ttf字符串(imagettftext) 我找不到任何内置的GD函数,所以我认为应该逐字添加一些恒定宽度 也许有人已经有了这样的功能:) 另外,最好的字体是arial。ttf不支持字距调整,因此您必须手动执行。就我个人而言,我编写了一个函数,可以分别编写每个字母。我现在找不到,但大致如下: function drawText(&$image, $text, $fgColor, $font, $fgColor,

是否有人有一个函数可以用指定的字母间距绘制ttf字符串(imagettftext)

我找不到任何内置的GD函数,所以我认为应该逐字添加一些恒定宽度

也许有人已经有了这样的功能:)


另外,最好的字体是arial。ttf不支持字距调整,因此您必须手动执行。就我个人而言,我编写了一个函数,可以分别编写每个字母。我现在找不到,但大致如下:

function drawText(&$image, $text, $fgColor, $font, $fgColor, 
                   $fontSize = 14, $kerning = 0, $x = 0, $y = 0) {
    $letters = explode('', $text);

    foreach ($letters as $n => $letter) {
        $bbox = imagettftext($image, $fontSize, 0, $x, $y, $fgColor, $font, $letter);
        $x += $bbox[2] + $kerning;
    }
}
尝试此功能:

$image = imagecreatetruecolor(500,200);
$text = "Text to print";
$text_color=imagecolorallocate($image,255,255,255);
$font_size = 18;
$space = 8;
$font = "path_to_font/arial.ttf";
$x=20;
$y=20;
for ($i = 0; $i <strlen($text); $i++){
   $arr = imagettftext ($image, $font_size,0, $x, $y, $text_color, $font, $text{$i});
   $x = $arr[4]+$space;
}
imagejpeg($image);
destroyimage($image);
$image=imagecreatetruecolor(500200);
$text=“要打印的文本”;
$text_color=imagecolorallocate($image,255255);
$font_size=18;
$space=8;
$font=“path\u to\u font/arial.ttf”;
$x=20;
$y=20;
对于($i=0;$i)

函数参数顺序符合标准的imagettftext参数顺序,最后一个参数是可选的$spacing参数。如果未设置或传递的值为0,则不会设置紧排/字母间距。

我知道前一段时间已经回答了这个问题,但我需要一个具有字母间距并保持角度偏移的解决方案

我修改了radzi的代码以实现这一点:

function imagettftextSp($image, $size, $angle, $x, $y, $color, $font, $text, $spacing = 0)
{        
    if ($spacing == 0)
    {
        imagettftext($image, $size, $angle, $x, $y, $color, $font, $text);
    }
    else
    {
        $temp_x = $x;
        $temp_y = $y;
        for ($i = 0; $i < strlen($text); $i++)
        {
            imagettftext($image, $size, $angle, $temp_x, $temp_y, $color, $font, $text[$i]);
            $bbox = imagettfbbox($size, 0, $font, $text[$i]);
            $temp_x += cos(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0]));
            $temp_y -= sin(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0]));
        }
    }
}
函数imagettftextSp($image、$size、$angle、$x、$y、$color、$font、$text、$spating=0)
{        
如果($spating==0)
{
imagettftext($image、$size、$angle、$x、$y、$color、$font、$text);
}
其他的
{
$temp_x=$x;
$temp_y=$y;
对于($i=0;$i
只需完成pidalia的回答(这是最好的),以避免使用特殊字符(如“é”或“θ”)带来麻烦


我已经尝试了这里的所有答案,但似乎没有一个做得很好。如果您绘制边界框,则会发生以下情况:

显然,它们的间隔并不均匀。由
imagettftext()
imagettfbbox()
返回的边界框似乎只告诉您绘制的内容。这似乎足够了,但事实并非如此,因为。这意味着即使您说字母应该在
(x,y)处绘制
,这将不是边界框的坐标之一。需要对紧排进行更正。

我为水平文本拼凑了以下代码:

function getBBoxW($bBox)
{
  return $bBox[2] - $bBox[0];
}


function imagettftextSpacing($image, $size, $x, $y, $color, $font, $text, $spacing = 0)
{
    $testStr = 'test';
    $testW   = getBBoxW(imagettfbbox($size, 0, $font, $testStr));
    foreach (mb_str_split($text) as $char)
    {
        $fullBox = imagettfbbox($size, 0, $font, $char . $testStr);
        imagettftext($image, $size, 0, $x - $fullBox[0], $y, $color, $font, $char);
        $x += $spacing + getBBoxW($fullBox) - $testW;
    }
}
结果要好得多。请注意,
$testStr
可以有任何值

下面是一个结果示例,第一行为普通文本,第二行为负间距:


很高兴看到你用这个答案回馈了Stack Overflow社区。好节目+1用mb_substr($text,$i,1)替换$text[$i]为了克服多字节字符的问题尽管我很欣赏这些努力,但我认为这个函数不够健壮。当它像这样迭代时,它会破坏字母间距。请自己看看。将间距0与间距0.1进行比较,你会注意到0.1的紧排结果到处都是。
function imagettftextSp($image, $size, $angle, $x, $y, $color, $font, $text, $spacing = 0)
{        
    if ($spacing == 0)
    {
        imagettftext($image, $size, $angle, $x, $y, $color, $font, $text);
    }
    else
    {
        $temp_x = $x;
        $temp_y = $y;
        for ($i = 0; $i < strlen($text); $i++)
        {
            imagettftext($image, $size, $angle, $temp_x, $temp_y, $color, $font, $text[$i]);
            $bbox = imagettfbbox($size, 0, $font, $text[$i]);
            $temp_x += cos(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0]));
            $temp_y -= sin(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0]));
        }
    }
}
static function imagettftextSp($image, $size, $angle, $x, $y, $color, $font, $text, $spacing = 0) {
    if ($spacing == 0) {
        imagettftext($image, $size, $angle, $x, $y, $color, $font, $text);
    } else {
        $temp_x = $x;
        $temp_y = $y;
        //to avoid special char problems
        $char_array = preg_split('//u',$text, -1, PREG_SPLIT_NO_EMPTY);
        foreach($char_array as $char) {
            imagettftext($image, $size, $angle, $temp_x, $temp_y, $color, $font, $char);
            $bbox = imagettfbbox($size, 0, $font, $char);
            $temp_x += cos(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0]));
            $temp_y -= sin(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0]));
        }
    }
}
function getBBoxW($bBox)
{
  return $bBox[2] - $bBox[0];
}


function imagettftextSpacing($image, $size, $x, $y, $color, $font, $text, $spacing = 0)
{
    $testStr = 'test';
    $testW   = getBBoxW(imagettfbbox($size, 0, $font, $testStr));
    foreach (mb_str_split($text) as $char)
    {
        $fullBox = imagettfbbox($size, 0, $font, $char . $testStr);
        imagettftext($image, $size, 0, $x - $fullBox[0], $y, $color, $font, $char);
        $x += $spacing + getBBoxW($fullBox) - $testW;
    }
}