2009-12-20 12 views
5

El siguiente código PHP genera texto como una imagen creada dinámicamente, ¿cómo podría lograr que la imagen solo fuera tan grande como el texto? Gracias.Cambiar el tamaño de la imagen de acuerdo con el tamaño del texto

<?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); 
?> 

ACTUALIZACIÓN 1: He encontrado la respuesta aquí con el ejemplo de su creador original - Creating IMage from Text in PHP - how can I make multiline?

ACTUALIZACIÓN 2: Versión de Martin Geisler también funciona bien

Respuesta

6

Cuando se utiliza una fuente TrueType, se utiliza el imageftbbox función para obtener el cuadro delimitador para un conjunto de caracteres de cadena con su fuente. El cuadro delimitador proporciona los desplazamientos desde el punto base a las cuatro esquinas del rectángulo ocupado por el texto. Así que si almacena el cuadro delimitador en $bb y utilizar imagefttext a poner texto en ($x, $y), a continuación, las esquinas tendrán estas coordenadas:

($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]) 

Eso nos dice que queremos un ancho de la imagen de ($x + $bb[2]) - ($x + $bb[6]) = $bb[2] - $bb[6] y de manera similar una altura de la imagen de $bb[3] - $bb[7]. El texto debe entonces una traducción en las coordenadas (-$bb[6], -$bb[7]) dentro de ese cuadro, ya que queremos tener

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

Puede probarlo con este código. Ponerlo en un archivo llamado img.php y vaya a img.php?q=Hello a prueba:

<?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); 
?> 

Si utiliza las fuentes de mapa de bits en su lugar, y luego mirar los imagefontwidth y imagefontheight funciones.

+0

Me gustaría utilizar fuentes TTF, miré a algunos de los ejemplos en la página imageftbbox pero me parece que no puede obtener las dimensiones del texto. – usertest

+0

Sí, lamento que haya respondido la pregunta incorrecta al principio; ahora he dado el código para las fuentes TrueType. –

+0

Probé el código y me aparece el error "La imagen" test.php "no se puede mostrar porque contiene errores". – usertest

2

@Martin La respuesta de Geisler es casi correcta, pero no pude conseguir que mi texto encajara por completo dentro de la imagen. ¡Intenté esto en cambio, que funciona perfectamente!

Desde el 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

Lo sentimos, parece que Windows y Linux funcionan de manera diferente, y que ningún script parece funcionar perfectamente en ambos. –

Cuestiones relacionadas