2009-12-20 6 views
5

Der folgende PHP-Code erzeugt Text als dynamisch erzeugtes Bild. Wie könnte ich das Bild nur so groß wie den Text bekommen? Vielen Dank.Bildgröße nach Textgröße ändern

<?php 
    header('Content-Type: image/jpeg'); 

    $text='Test'; 

    $img = imageCreate(200,200); 

    imagecolorallocate($img, 255, 255, 255); 

    $textColor = imagecolorallocate($img, 0, 0, 0); 

    imagefttext($img, 15, 0, 0, 55, $textColor, 'bgtbt.ttf', $text); 

    imagejpeg($img); 

    imagedestroy($img); 
?> 

UPDATE 1: ich die Antwort hier am Beispiel des ursprünglichen Plakat gefunden - Creating IMage from Text in PHP - how can I make multiline?

UPDATE 2: Martin Geisler-Version funktioniert auch gut

Antwort

6

Bei Verwendung einer Truetype-Schriftart, verwenden Sie die imageftbbox Funktion, um den Begrenzungsrahmen für einen Zeichensatz mit Ihrer Schriftart zu erhalten. Der Begrenzungsrahmen gibt die Abstände vom Basispunkt zu den vier Ecken in dem vom Text belegten Rechteck an. Also, wenn Sie den Begrenzungsrahmen in $bb speichern und imagefttext verwenden, um Text in ($x, $y) zu setzen, dann werden die Ecken haben diese Koordinaten:

($x + $bb[6], $y + $bb[7])   ($x + $bb[4], $y + $bb[5]) 
          +-------+ 
          | Hello | 
          +-------+ 
($x + $bb[0], $y + $bb[1])   ($x + $bb[2], $y + $bb[3]) 

, die uns sagt, dass wir eine Bildbreite von ($x + $bb[2]) - ($x + $bb[6]) = $bb[2] - $bb[6] wollen und in ähnlicher Weise eine Bildhöhe von $bb[3] - $bb[7]. Der Text sollte dann an den Koordinaten gemacht werden (-$bb[6], -$bb[7]) innerhalb dieses Bild, da wir

(0, 0) = ($x + $bb[6], $y + $bb[7]) ==> $x = -$bb[6] and $y = -$bb[7] 

Sie können es versuchen, mit diesem Code haben wollen. Legen Sie es in eine Datei img.php genannt und wechseln Sie zu img.php?q=Hello zu testen:

<?php 
header("Content-type: image/png"); 

$q  = $_REQUEST['q']; 
$font = "Impact.ttf"; 
$size = 30; 
$bbox = imageftbbox($size, 0, $font, $q); 

$width = $bbox[2] - $bbox[6]; 
$height = $bbox[3] - $bbox[7]; 

$im = imagecreatetruecolor($width, $height); 
$green = imagecolorallocate($im, 60, 240, 60); 

imagefttext($im, $size, 0, -$bbox[6], -$bbox[7], $green, $font, $q); 
imagepng($im); 
imagedestroy($im); 
?> 

Wenn Sie die Bitmap-Fonts verwenden, anstatt, dann schauen Sie sich die imagefontwidth und imagefontheight Funktionen.

+0

I ttf Schriftarten verwenden möchten, schaute ich auf der imageftbbox einige der Beispiele an, aber ich kann nicht die Dimensionen des Textes zu bekommen scheinen. – usertest

+0

Ja, es tut mir leid, dass ich zuerst die falsche Frage beantwortet habe - jetzt habe ich Code für TrueType-Fonts angegeben. –

+0

Ich habe den Code ausprobiert und erhalte den Fehler "Das Bild" test.php "kann nicht angezeigt werden, weil er Fehler enthält." – usertest

2

@Martin Geislers Antwort ist fast korrekt, aber ich konnte meinen Text nicht vollständig in das Bild einfügen. Ich habe das stattdessen versucht, was perfekt funktioniert!

Vom PHP Manual's User Contributed Notes:

$text = "<?php echo \"hello, world\"; ?>"; 
$font = "./arial.ttf"; 
$size = "60"; 

$bbox = imagettfbbox($size, 0, $font, $text); 

$width = abs($bbox[2] - $bbox[0]); 
$height = abs($bbox[7] - $bbox[1]); 

$image = imagecreatetruecolor($width, $height); 

$bgcolor = imagecolorallocate($image, 255, 255, 255); 
$color = imagecolorallocate($image, 0, 0, 0); 

$x = $bbox[0] + ($width/2) - ($bbox[4]/2); 
$y = $bbox[1] + ($height/2) - ($bbox[5]/2); 

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor); 
imagettftext($image, $size, 0, $x, $y, $color, $font, $text); 

$last_pixel= imagecolorat($image, 0, 0); 

for ($j = 0; $j < $height; $j++) 
{ 
    for ($i = 0; $i < $width; $i++) 
    { 
     if (isset($blank_left) && $i >= $blank_left) 
     { 
      break; 
     } 

     if (imagecolorat($image, $i, $j) !== $last_pixel) 
     { 
      if (!isset($blank_top)) 
      { 
       $blank_top = $j; 
      } 
      $blank_left = $i; 
      break; 
     } 

     $last_pixel = imagecolorat($image, $i, $j); 
    } 
} 

$x -= $blank_left; 
$y -= $blank_top; 

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor); 
imagettftext($image, $size, 0, $x, $y, $color, $font, $text); 

header('Content-type: image/png'); 
imagepng($image); 
imagedestroy($image); 
+0

Tut mir leid, es scheint, dass Windows und Linux anders funktionieren, und dass kein Skript in beiden zu funktionieren scheint. –