2012-03-26 6 views
2

人。PHPでGD2の単語ラップ機能はありますか?

画像にGD2のテキストに若干の問題があります。私はすべてが動作している今、私はイメージ内にラップすることができますイメージ上のテキストを追加しようとします。

たとえば、私は幅200pxのイメージと大きなテキストブロックを持っています。 imagettftext()を使用すると、テキストはイメージの境界線を越え、実際に部分的なテキストのみが表示されます。私はZendのテキストラップ関数を使用しようとしましたが、ここで正確な結果を出すわけではありません(この場合は動作しないと言っているわけではありません)。

テキストが収まる幅のボックスを設定するための専用のGD2メソッドがありますか?そのボックスの境界線に当たった場合、改行してください。

答えて

5

ないそのあなたが探しているけど、あなたはこれを試すことができるもの:safarovから

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

Upvoted、およびhttp://www.php.net/manual/en/function.imagettfbbox上の複数の実装があります。ポスターがすぐに使えるものを探している場合は、php( "wrap"を検索してください)。 – Yuriy

+0

ユリの言及されたリンクにある機能を使用していただきありがとうございます。 Ninjaによって書かれた関数:) – arma

+0

部門の幅と高さに応じて部門内にスペースを追加せずに行を分割する方法はありますか? –

1

残念ながら、私はこれを行う簡単な方法はないと思います。あなたができる最も良い方法は、現在のフォントのテキスト幅と、そのn番目の文字に手動で壊すことができる文字の数を近似的に計算することです。

モノスペースフォントを使用している場合(私は知らないことがあります)、均等に配置されているため正確な結果が得られます。確か

3

機能は、私のユーザーの場合のために実証され、小さなバグが含まれています。私は$の幅よりも大きい単語を送信した場合、それはその後のすべての単語を改行でしょう、例えばので:理由がある

veryloooooooooooooongtextblablaOVERFLOWING 
this 
should 
be 
one 
line 

、imagettfboxは常にテキスト内のその「悪質な」言葉と> $幅となります。私の解決策は、各単語の幅を別々にチェックし、必要に応じて単語の幅を$ 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; 
} 
関連する問題