php imagettftext интервал между буквами - PullRequest
6 голосов
/ 03 августа 2011

Есть ли у кого-нибудь функция, которая рисует строку ttf (imagettftext) с указанным межбуквенным интервалом?

Я не могу найти встроенную функцию GD, поэтому я думаю, что это следует делать буквенно, добавляя некоторую константуширина.

Может быть, у кого-то уже есть такая функция:)

пс.лучший шрифт будет arial.ttf

Ответы [ 5 ]

22 голосов
/ 04 августа 2011
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;
        for ($i = 0; $i < strlen($text); $i++)
        {
            $bbox = imagettftext($image, $size, $angle, $temp_x, $y, $color, $font, $text[$i]);
            $temp_x += $spacing + ($bbox[2] - $bbox[0]);
        }
    }
}

и звонок:

imagettftextSp($image, 30, 0, 30, 30, $black, 'arial.ttf', $text, 23);

Порядок параметров функции соответствует стандартному порядку параметров imagettftext, а последний параметр является необязательным параметром $ spacing. Если не установлено или передано значение 0, кернинг / межбуквенный интервал не установлены.

10 голосов
/ 14 августа 2012

Я знаю, что на этот вопрос ответили некоторое время назад, но мне нужно было решение, которое содержало бы межбуквенный интервал и поддерживало угловые смещения.

Я изменил код Радзи, чтобы выполнить это:

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]));
        }
    }
}
6 голосов
/ 16 июля 2013

Просто, чтобы завершить ответ Пидалии (который является лучшим), чтобы избежать некоторых проблем со специальным символом (например, "é" или "à")

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]));
        }
    }
}
0 голосов
/ 03 августа 2011

Попробуйте эту функцию:

$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);
0 голосов
/ 03 августа 2011

GD не поддерживает кернинг, поэтому вам придется делать это вручную.Лично я написал функцию, которая будет писать каждое письмо отдельно.Я не могу найти это прямо сейчас, но это что-то вроде:

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;
    }
}
...