imagettftext mit Wordwrap

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • imagettftext mit Wordwrap

    Hallo zusammen,

    ich war auf der Suche nach einer Möglichkeit, einen Text ab einer bestimmten Breite umzubrechen. Dabei fand ich eine Funktion, die das auch einwandfrei tat. Nun würde ich die Funktion gerne so ändern, dass diese z.B. nur die ersten drei Zeilen ausgibt und die restlichen Zeilen ignoriert. Mit meinen bescheidenen Programmierkenntnissen habe ich dann die variable "$zeile" eingefügt. Aber das funktioniert nicht richtig. So wird nur das erste Wort der letzen gewünschten Zeile ausgegeben.

    Das zweite Problem ist, dass ein langes Wort abgeschnitten wird. Ich würde hier aber gerne einen harten Umbruch erzwingen, so das auch ein langes Wort wenn es an die Begrenzung kommt, getrennt wird z.B. "Dampfschifffahrtsgesells" "chaft"

    Könnt Ihr mir helfen? Vielen Dank im voraus​ Hier der script:

    PHP-Code:
    <?php
    function wrapText($fontSize$fontFace$string$width)
    {
    $zeile=0;  //neu
    $ret "";
    $arr explode(" "$string);
    foreach(
    $arr as $word)
    {
    $testboxWord imagettfbbox($fontSize0$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($word0$len);
    $len--;
    $testboxWord imagettfbbox($fontSize0$fontFace$word);
    }
    $teststring $ret ' ' $word;
    $testboxString imagettfbbox($fontSize0$fontFace$teststring);
    if (
    $zeile<3//neu
    //neu
    if(($testboxString[2] > $width) )
    {
    $ret.=($ret == "" "" "\n") . $word;
    $zeile++; //neu
    }
    else
    {
    $ret.=($ret == "" "" ' ') . $word;
    }
    //neu
    }
    return 
    $ret;
    }

    $size=14;
    $breite=200;
    $bild imagecreatetruecolor(640480);
    $intern="arial.ttf";
    $weiss imagecolorallocate($bild255255255);
    $blau imagecolorallocate($bild130184);
    imagefill($bild00$weiss);

    $text="Das ist ein test um zu prüfen, ob ein Wortumbruch auch korrekt stattfindet. Das Wort Dampfschifffahrtsgesellschaft wird abgeschnitten.";
    $wrap wrapText($size$intern$text$breite);
    imagettftext($bild$size0100100$blau$intern$wrap);

    header("Content-type: image/png");
    imagepng($bild);
    imagedestroy($bild);
    ?>
    Zuletzt geändert von Mr_Frost; 14.06.2025, 12:45.

  • #2
    PHP-Code:
    <?php
    function wrapText($fontSize$fontFace$string$width$max_lines)
    {
       if (
    $fontSize <= || ! strlen($fontFace) || ! strlen($string) || $width <= 0)
           return 
    $string;
      
       
    $lines = array();
      
       
    $more true;
      
       
    $text_position 0;
       
    $next_position 1;
      
       while (
    count($lines) < $max_lines && $more)
       {
           
    $substring substr($string$text_position$next_position);
          
           
    $testboxString imagettfbbox($fontSize0$fontFace$substring);
          
           if(
    $testboxString[2] > $width)
           {
               
    $substring substr($string$text_position$next_position 1);
              
               
    $lines[] = $substring;
              
               
    $text_position += $next_position 1;
              
               if (
    strlen($string) <= $text_position)
                   
    $more false;

               
    $next_position 1;
           }
           else
           {
               
    $len $text_position $next_position;

               
    $next_position++;
              
               if (
    strlen($string) < $len)
                   
    $more false;
           }
       }
      
       if (
    count($lines))
          
    $ret implode("\n"$lines);
       else
          
    $ret $string;
     
      return 
    $ret;
    }

    $max_lines 3;
    $size=14;
    $breite=200;
    $bild imagecreatetruecolor(640480);
    $intern="fonts/arial.ttf";
    $weiss imagecolorallocate($bild255255255);
    $blau imagecolorallocate($bild130184);
    imagefill($bild00$weiss);

    $text="Das ist ein test um zu prüfen, ob ein Wortumbruch auch korrekt stattfindet. Das Wort Dampfschifffahrtsgesellschaft wird abgeschnitten.";

    $wrap wrapText($size$intern$text$breite$max_lines);
    imagettftext($bild$size0100100$blau$intern$wrap);

    header("Content-type: image/png");
    imagepng($bild);
    imagedestroy($bild);
    ?>
    Zuletzt geändert von scatello; 14.06.2025, 14:25.

    Kommentar


    • #3
      Super, vielen lieben Dank. Eine Frage habe ich noch. Aktuell wird ja jedes Wort umgebrochen d.h. Blocksatz. Gibt es auch die Möglichkeit nur dann einen harten cut zu setzen, wenn das Wort z.B. länger als 20 Zeichen ist? Wenn das Wort kürzer ist, soll es komplett in die nächste Zeile fallen.

      Kommentar


      • #4
        Möglich ist das, aber dann müsste man einen anderen Ansatz nehmen. Das Script von mir geht zeichenweise durch den String, diesen muss man dann doch wortweise durchlaufen und die Berechnung ändern.

        Kommentar


        • #5
          Jep, danke für die Antwort. Das neue Script ist Super. Noch einmal vielen Lieben Dank

          Kommentar

          Lädt...
          X