在php中有GD2的自动换行功能吗?

时间:2012-03-26 10:12:40

标签: php word-wrap gd2

我对图像上的GD2文字有轻微问题。我有一切工作,现在我尝试在图像上添加可以包裹在图像中的文本。

例如,我有宽度为200px的图像和大块文本。如果您使用imagettftext()文字超出图片边框,则只有部分文字可见。我曾尝试使用Zend的文本换行功能,但它并不总是在这里产生准确的结果(不是说它不起作用,只是在这种情况下不起作用)。

是否有一些专用的GD2方法来设置文本应该适合的宽度框,如果它碰到那个框的边框,它应该在新行中继续?

3 个答案:

答案 0 :(得分:5)

不确定你要找的是什么,但你可以试试这个:

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

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

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

  return $ret;
}

答案 1 :(得分:3)

safarov中的函数包含一个针对我的用户案例演示的小错误。如果我发送了一个大于$ width的单词,那么之后会对每个单词进行换行,例如:

veryloooooooooooooongtextblablaOVERFLOWING
this 
should 
be 
one 
line

原因是,imagettfbox将始终是> $宽度与#34;恶意"文本内的文字。我的解决方案是单独检查每个单词宽度,并可选择剪切单词,直到它适合$ width(如果我们达到0,则取消剪切)。然后我继续正常的文字包装。结果如下:

veryloooooooooooooongtextblabla
this should be one line

以下是修改后的功能:

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

    $ret = "";
    $arr = explode(" ", $string);

    foreach ( $arr as $word ){
      $testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word);

      // huge word larger than $width, we need to cut it internally until it fits the width
      $len = strlen($word);
      while ( $testboxWord[2] > $width && $len > 0) {
        $word = substr($word, 0, $len);
        $len--;
        $testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word);
      }

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

  return $ret;
}

答案 2 :(得分:1)

不幸的是,我认为没有一种简单的方法可以做到这一点。您可以做的最好的方法是近似计算图像宽度以及当前字体中文本可以容纳的字符数,并在第n个字符上手动分解。

如果你使用的是等宽字体(不太可能,我知道),你可以获得准确的结果,因为它们是均匀间隔的。