Привет,
Сразу хочу отметить, что это не дубликат.
Я уже видел подобные посты, но все они используют определенный шрифт, который не тот случай.
Я использую шрифт по умолчанию номер 3 (для этого примера), и я хочу иметь возможность рассчитать размер вывода и поместить его в точный центр моего $ canvas
imagestring($canvas,3,imagesx($canvas),imagesy($canvas),$myString,imagecolorallocate($canvas,239,13,177));
Я знаю, как сделать вычисление, чтобы поместить его в центр, это довольно легко, единственный пропущенный параметр — это точный размер в пикселях (x / y) моей строки, учитывая шрифт № 3.
пикселей (х / у) моей строки, учитывая шрифт № 3.
Обновленный ответ без использования определенного шрифта. Встроенные шрифты PHP действительно моноширинные (протестировано и работает):
$font = 3;
$img = imagecreatetruecolor(500, 500);
$text = "Waldson Patricio";
$color = imagecolorallocate($img, 255, 255, 255);
$size = strlen($text);
$tw = $size * imagefontwidth($font);
$th = imagefontheight($font);imagestring($img, $font, (imagesx($img) - $tw) / 2 , (imagesy($img) - $th) / 2, $text, $color);
header('Content-type:image/jpeg');
imagejpeg($img);
imagettfbbox а также imagettftext сделаем работу:
//setup
$font = '<path to font>';
$string = 'My String';
$fontSize = 12;
//getting width and height
$bBox = imagettfbbox($fontSize, 0, $font, $string);
$width = $bBox[2] - $bBox[0];
$height = $bBox[1] - $bBox[7];
//drawing in the center
imagettftext($canvas, $fontSize, 0, (imagesx($canvas) - $width)/2, (imagesy($canvas) - $height)/2, $color, $font, $string);
После некоторых исследований я не могу обнаружить, что шрифты, используемые в строке изображения, имеют стандартную ширину или интервал. В моей реализации PHP, кажется, что шрифт 3 имеет символы 6 на 9 пикселей с интервалом в 1 пиксель, одинарный, поэтому 7 * strlen должен давать довольно точную ширину, а 9 — высоту (я предполагаю, что вы работаете только с центрированием линия) строкового изображения. Однако это может зависеть от платформы или реализации, поэтому, если это не сработает, вам придется измерить себя.
Это решение, если вы должны использовать imagestring (), конечно — использование imagettftext () и imagettfbbox () было бы намного лучше для точного измерения, как предложил Уолдсон.