2

人。

画像のGD2テキストに少し問題があります。私はすべてが機能しているので、画像内に折り返すことができるテキストを画像に追加しようとしています。

たとえば、幅200pxの画像と大きなテキストブロックがあります。テキストを使用するimagettftext()と、画像の境界を越えて、実際には部分的なテキストのみが表示されます。Zendのテキスト折り返し機能を使用しようとしましたが、ここで常に正確な結果が得られるとは限りません(機能しないと言っているわけではなく、この場合のみです)。

テキストが収まる幅のボックスを設定するための専用のGD2メソッドはありますか?それがそのボックスの境界に当たった場合は、新しい行に続く必要がありますか?

4

3 に答える 3

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;
}
于 2012-03-26T10:19:47.987 に答える
3

safarov の関数には、私のユーザー ケースで実証された小さなバグが含まれています。$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;
}
于 2013-04-22T14:43:35.670 に答える
1

残念ながら、これを行う簡単な方法はないと思います。あなたができる最善の方法は、画像の幅と、現在のフォントのテキストが収まる文字数を概算し、その n 番目の文字で手動で分割することです。

等幅フォントを使用している場合 (ありそうもないことですが)、等間隔であるため、正確な結果を得ることができます。

于 2012-03-26T10:16:28.913 に答える