У кого-нибудь есть функция, которая рисует строку ttf (imagettftext) с заданным интервалом между буквами?
Я не могу найти встроенную функцию GD, поэтому я думаю, что это должно быть сделано буквой по букве, добавляющей некоторую постоянную ширину.
Может быть, у кого-то есть такая функция уже 🙂
пс. лучшим шрифтом будет arial.ttf
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, интервал кернинга / буквы не задан.
Я знаю, что это ответ на некоторое время назад, но мне нужно было решение, имеющее расстояние между буквами и поддерживающее угловые смещения.
Я изменил код 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])); } } }
Просто чтобы завершить ответ pidalia (что лучше), чтобы избежать неприятностей со специальным символом (например, «é» или «à»)
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])); } } }
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; } }
Попробуйте эту функцию:
$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);