2017-03-05 3 views
0

Im Zeichnen eines dynamischen Text auf einem Bild mit GD-Bibliothek zentriert.PHP GD Zentrum mehrere Zeilen (dynamisch Text)

Was ist der beste Weg, um alle Linien auszurichten?

<?php 


function imagettfstroketext(&$image, $size, $angle, $x, $y, &$textcolor, &$strokecolor, $fontfile, $text, $px) { 
    for($c1 = ($x-abs($px)); $c1 <= ($x+abs($px)); $c1++) 
     for($c2 = ($y-abs($px)); $c2 <= ($y+abs($px)); $c2++) 
      $bg = imagettftext($image, $size, $angle, $c1, $c2, $strokecolor, $fontfile, $text); 
    return imagettftext($image, $size, $angle, $x, $y, $textcolor, $fontfile, $text); 
} 



$image = "12.png"; 
$font = "./impact.ttf"; 
$font_size = "50"; 

$image_2 = imagecreatefrompng($image); 
$black = imagecolorallocate($image_2, 255,255,255); 
$black2 = imagecolorallocate($image_2, 0,0,0); 

$image_width = imagesx($image_2); 
$image_height = imagesy($image_2); 
$margin = 35; 


$text = "This is the Text. It is dynamically long. This text will be split using the function under this text."; 

//explode text by words 
$text_a = explode(' ', $text); 
$text_new = ''; 
foreach($text_a as $word){ 
    //Create a new text, add the word, and calculate the parameters of the text 
    $box = imagettfbbox($font_size, 0, $font, $text_new.' '.$word); 
    //if the line fits to the specified width, then add the word with a space, if not then add word with new line 
    if($box[2] > $image_width - $margin*2){ 
     $text_new .= "\n".$word; 
    } else { 
     $text_new .= " ".$word; 
    } 
} 

$text_box = imagettfbbox($font_size,0,$font,$text_new); 
$text_width = $text_box[2]-$text_box[0]; // lower right corner - lower left corner 
$text_height = $text_box[3]-$text_box[1]; 




$x = ($image_width/2) - ($text_width/2); 
$y = ($image_height/2) - ($text_height/2); 


$font_color = imagecolorallocate($image_2, 255, 255, 255); 
$font_color2 = imagecolorallocate($image_2, 0, 0, 0); 
$stroke_color = imagecolorallocate($image_2, 0, 0, 0); 

$white = imagecolorallocate($im, 255, 255, 255); 
$black = imagecolorallocate($im, 0, 0, 0); 
$grey = imagecolorallocate($im, 175, 175, 175); 


imagettfstroketext($image_2, $font_size ,0,$x,$y,$font_color, $stroke_color, $font, $text_new, 0); 

header ("Content-type: image/png"); 
imagejpeg($image_2, "../img/output.png"); 
    imagedestroy($image_2); 

?> 

Dies ist, was es jetzt aussieht: enter image description here

Dies ist, wie es aussehen sollte: würde enter image description here

Mit dreimal "imagettfstroketext" mit dem Hinzufügen von "$ y + 50" Mach den Trick, aber der Text ist dynamisch.

Irgendwelche Vorschläge?

freundlichen Grüßen

+0

Mögliches Duplikat von [Zentriert mehrere Textzeilen mit GD und PHP] (http://stackoverflow.com/questions/9728550/center-aligning-multiple-lines-of-text-with-gd-and-php) – timclutton

Antwort

0

würde ich ein temporäres Bild auf einer Linie erzeugen, die in einem Array die akkumulierte Länge speichert. Bestimmen Sie dann genau, welche Wörter in eine Zeile passen, und den Versatz, um jede Zeile zu zentrieren. Dann erstelle das Bild.

Alternativ können Sie separate Bilder für jede Zeile erstellen und sie dann mit dem richtigen Offset kombinieren.