2012-03-26 8 views
2

Menschen.Gibt es eine Wortumbruchfunktion für GD2 in PHP?

Ich habe ein kleines Problem mit GD2 Text auf Bild. Ich habe alles funktioniert und jetzt versuche ich Text auf Bild hinzufügen, die in Bild umbrechen kann.

Zum Beispiel habe ich Bild mit der Breite 200px und großen Textblock. Wenn Sie imagettftext() verwenden, geht der Text über die Grenzen des Bildes hinaus und nur der Teiltext ist tatsächlich sichtbar. Ich habe versucht, die Textumbruchfunktion von Zend zu verwenden, aber es produziert hier nicht immer genaue Ergebnisse (nicht sagen, dass es nicht funktioniert, nur nicht in diesem Fall).

Gibt es eine spezielle GD2-Methode, um eine bestimmte Breite festzulegen, in die der Text passen soll, und wenn er auf den Rahmen der Box trifft, sollte er in der neuen Zeile fortgesetzt werden?

Antwort

5

Nicht sicher seine was Sie suchen, aber können Sie diese versuchen:

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, und es gibt mehrere Implementierungen auf http://www.php.net/manual/en/function.imagettfbbox. php (suche nach "wrap") wenn das Poster nach einem gebrauchsfertigen sucht. – Yuriy

+0

Danke verwendete Funktion, die in Yuriys erwähntem Link ist. Funktion geschrieben von Ninja :) – arma

+0

gibt es eine Möglichkeit, die Zeilen zu brechen, ohne Platz in der Division nach Division Breite und Höhe? –

1

Leider glaube ich nicht, dass es eine einfache Möglichkeit ist, dies zu tun. Das Beste, was Sie tun können, ist die ungefähre Berechnung der Bildbreite und der Anzahl der Zeichen, die Ihr Text in der aktuellen Schriftart aufnehmen kann, und die manuelle Bruchfunktion für das n-te Zeichen.

Wenn Sie eine Monospace-Schriftarten verwenden (unwahrscheinlich, ich weiß), können Sie ein genaues Ergebnis erhalten, da sie gleichmäßig verteilt sind.

3

Die Funktion von Safarov enthält einen kleinen Fehler, der für meinen Benutzer Fall demonstriert. Wenn ich ein Wort größer als $ Breite gesendet, es wäre jedes Wort hinterher, so zum Beispiel Newline:

veryloooooooooooooongtextblablaOVERFLOWING 
this 
should 
be 
one 
line 

Der Grund dafür ist, imagettfbox wird immer> $ Breite mit diesem „bösartigen“ Wort innerhalb Textes. Meine Lösung bestand darin, einfach jede Wortbreite einzeln zu prüfen und das Wort optional zu schneiden, bis es $ width entspricht (oder den Schnitt abbrechen, wenn wir die Länge 0 erreichen). Dann mache ich mit normalem Wordwrapping weiter. Das Ergebnis ist so etwas wie:

veryloooooooooooooongtextblabla 
this should be one line 

Hier ist die modifizierte Funktion:

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