Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中是否有GD2的换行功能?_Php_Word Wrap_Gd2 - Fatal编程技术网

php中是否有GD2的换行功能?

php中是否有GD2的换行功能?,php,word-wrap,gd2,Php,Word Wrap,Gd2,人们 我对图像上的GD2文本有点小问题。我有一切工作,现在我尝试在图像上添加文本,可以包装在图像中 例如,我有宽度为200px的图像和一大块文本。如果使用imagettftext()文本超出了图像的边框,实际上只有部分文本可见。我曾尝试使用Zend的文本换行功能,但它并不总是在这里产生准确的结果(并不是说它不起作用,只是在这种情况下不起作用) 是否有一些专门的GD2方法来设置文本应该适合的宽度框,如果它碰到框的边框,它应该继续在新的行中?不幸的是,我认为没有一种简单的方法可以做到这一点。你所能做

人们

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

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


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

不幸的是,我认为没有一种简单的方法可以做到这一点。你所能做的最好的事情就是大致计算你的图像宽度,以及你的文本在当前字体中可以容纳多少个字符,然后在第n个字符上手动打断它


如果您使用的是单空格字体(我知道不太可能),则可以获得准确的结果,因为它们的间距是均匀的。

不确定您要的是什么,但您可以尝试以下方法:

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

来自safarov的函数包含一个小bug,在我的用户案例中演示了这个bug。如果我发送了一个大于$width的单词,它会在之后将每个单词换行,例如:

veryloooooooooooooongtextblablaOVERFLOWING
this 
should 
be 
one 
line
原因是,imagettfbox的宽度始终大于$width,文本中包含“恶意”字。我的解决方案是简单地分别检查每个字的宽度,并选择剪切该字,直到它适合$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;
}

向上投票,如果poster正在寻找一个现成的应用程序,在(搜索“包装”)上还有更多的实现。感谢Yuriy提到的链接中使用的功能。忍者编写的函数:)有没有办法根据分区的宽度和高度在不增加分区空间的情况下打断这些线?