перенос и центрирование текста в gd и php


У меня есть строка текста, которую мне нужно обернуть и центрировать на изображении GD. Я также использую шрифт ttf. Может ли что-нибудь оказать мне некоторую помощь, пожалуйста?

Мне удалось получить некоторый текст для переноса, выполнив следующее, но теперь мне нужно поместить его в центр:

function wrap($fontSize, $angle, $fontFace, $string, $width){

    $ret = "";

    $arr = explode(' ', $string);

    foreach ( $arr as $word ){

        $teststring = $ret.' '.$word;
        $testbox = imagettfbbox($fontSize, $angle, $fontFace, $teststring);
        if ( $testbox[2] > $width ){
            $ret.=($ret==""?"":"\n").$word;
        } else {
            $ret.=($ret==""?"":' ').$word;
        }
    }

    return $ret;
}
Author: David, 2011-02-17

3 answers

Для центрирования как по горизонтали, так и по вертикали: получите половину высоты от imagettfbbox всего текста (с новыми строками) и вычитайте его из половины высоты вашего изображения ($start_x).

Теперь разделите текст на новые строки, создайте поле ttf для каждой строки и получите его высоту ($h) и половину ширины ($w). Нарисуйте линию, начиная с половины ширины изображения + $w и $start_x, добавьте $h к $start_x, повторяйте, пока не будут написаны все строки.

 1
Author: dev-null-dweller, 2011-02-17 21:14:34

Пользователь valentijn de Pagter предоставляет в руководстве по php net хорошую функцию для вычисления поля (я вижу, что вы действительно используете imagettfbbox()) и из массива, который он возвращает, вычисляет, как центрировать текст. Вы можете найти его здесь:

Центрируйте текст с помощью imagettfbbox

 2
Author: Damien Pirsy, 2011-02-17 21:09:07

Вот что я сделал. используя функцию imagettftext, вы можете добавить новые метки строк и перейти к следующей строке. Вы можете добавить \n в строку после определенного количества символов. Этот пример будет прерываться только на пробелах, поэтому слова не будут обрезаны.

            $description=$property['description'];
            $len=strlen($description);
            $str="";
            $c=0;
            for($i=0;$i<$len;$i++){
                $chr=substr($description,$i,1);
                $str.=$chr;
                if($c>40 && $chr==" ") {
                    $str.="\n";
                    $c=0;   
                }
                $c++;
                }
            $result=$str;
            imagettftext($img, 15, 0, $x - 60, $descmgn, $textcolor, $font, $result);
 0
Author: Adam F, 2012-06-06 15:18:59