2012-03-15 34 views
5

Estoy tratando de imprimir varias líneas de texto en una imagen y centrarlas en el centro.Centro alineando varias líneas de texto con GD y PHP

decir

        Esta es
Una cadena de texto

En este momento, sólo tengo la posición izquierda para toda la cadena. ¿Hay algún atajo para hacer que eso funcione? Creo que debería ser un getttfbox en toda la cadena, luego un estallido en los saltos de línea, luego centrar el nuevo texto dentro de ese ttfbox más grande. Eso es un dolor en el culo ...

EDIT: se le ocurrió una solución:

foreach ($strings as $index => $string) { 
     $parts = explode ("\n", $string['string']); 
     if (count ($parts) > 1) { 
      $bounds = imagettfbbox (intval($string['fontsize']), 0, $font, $string['string']); 
      $width = $bounds[2] - $bounds[0]; 
      $height = $bounds[3] - $bounds[5]; 
      $line_height = $height/count ($parts); 

      foreach ($parts as $index => $part) { 
       $bounds = imagettfbbox (intval($string['fontsize']), 0, $font, $part); 
       $new_width = $bounds[2] - $bounds[0]; 
       $diff = ($width - $new_width)/2; 
       $new_left = $string['left'] + $diff; 

       $new_string = $string; 
       $new_string['left'] = $new_left; 
       $new_string['top'] = $string['top'] + ($index * $line_height); 
       $new_string['string'] = $part; 
       $new_strings[] = $new_string; 
      } 
     } 
    } 

    if ($new_strings) 
     $strings = $new_strings; 

En este caso, cada cadena $ es una matriz con un poco de información acerca de cómo y por qué imprimir. Espero que ayude a alguien.

+0

Por favor, no editar su respuesta a su pregunta, pero en lugar de escribir una nueva respuesta (y aceptar que, si esa es la solución que funcionó para usted). – darthmaim

Respuesta

2

Esta es una función que usará el cuadro de imagen que usted mencionó, no puedo ayudar con el envío de palabras automático, pero tal vez como sugirió, divida la cadena antes de tiempo.

function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text) 
{ 
    $bbox = imagettfbbox($size, $angle, $fontfile, $text); 
    $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0; 
    $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0; 
    $px = $x-$dx; 
    $py = $y-$dy; 
    return imagettftext($im, $size, $angle, $px, $py, $color, $fontfile, $text); 
} 

Editar: También encontraron esta en los comentarios de la documentación de PHP ...

Aquí es una simple función de ajustar el texto de entrar en una imagen. Envolverá en tantas líneas como sea necesario, pero $ angle tiene que ser cero. El parámetro $ width es el ancho de la imagen.

function wrap($fontSize, $angle, $fontFace, $string, $width) 
{ 
    $ret = ""; 
    $arr = explode(' ', $string); 
    foreach ($arr as $word) 
    { 
    $teststring = $ret.' '.$word; 
    $testbox = imagettfbbox($fontSize, $angle, $fontFace, $teststring); 
    if ($testbox[2] > $width){ 
     $ret.=($ret==""?"":"\n").$word; 
    } else { 
     $ret.=($ret==""?"":' ').$word; 
    } 
    } 
    return $ret; 
} 
+0

El problema es que no está alineado en el centro de la imagen en sí, está alineado al centro en relación con las otras líneas de texto. es decir, la imagen podría tener 500 px de ancho, la izquierda del texto podría ser de 100 px, el ancho del texto podría ser de 150 px y tener 2 líneas, y el texto debería estar centrado en sí mismo. –

+0

Luego, supongo que necesitarás línea por línea imagettftext_cr() como ya has mencionado. http://php.net/manual/en/function.imagettftext.php buscar la publicación por "sk89q" el 14-Mar-2008 03:36 – Scuzzy

+0

Sí, todavía no es exactamente lo que necesito. Es genial, puedo escribir la función, solo esperaba que alguien tuviera un atajo –

-1

obtener la longitud de la cadena (strlen), y una anchura media de cada letra, multiplicar el resultado strlen por la anchura media y luego restar que a partir de su posición horizontal.

$text="center this"; 
$h=50; 
$h=(strlen($text)*15)-$h; 

Dime si funciona porque nunca he probado este

+0

Eso realmente no va a cortar por lo que estoy tratando de hacer. Gracias sin embargo. –

1

Usted podría usar el excelente gd-text biblioteca. Si utiliza el compositor, un ejemplo podría ser la siguiente:

<?php 
require __DIR__.'/../vendor/autoload.php'; 

use GDText\Box; 

$im = imagecreatetruecolor(500, 500); 
$backgroundColor = imagecolorallocate($im, 0, 18, 64); 
imagefill($im, 0, 0, $backgroundColor); 

$box = new Box($im); 
$box->setFontFace(__DIR__.'/Pacifico.ttf'); // http://www.dafont.com/pacifico.font 
$box->setFontSize(80); 
$box->setFontColor([255, 255, 255]); 
$box->setTextShadow([0, 0, 0, 50], 0, -2); 
$box->setLeading(0.7); 
$box->setBox(20, 20, 460, 460); 
$box->setTextAlign('center', 'center'); 
$box->draw("Pacifico"); 

header("Content-type: image/png"); 
imagepng($im); 
4

Usted puede utilizar stil/gd-text clase. Descargo de responsabilidad: soy el autor.

<?php 
use GDText\Box; 
use GDText\Color; 

$img = imagecreatefromjpeg('image.jpg'); 

$textbox = new Box($img); 
$textbox->setFontSize(12); 
$textbox->setFontFace('arial.ttf'); 
$textbox->setFontColor(new Color(0, 0, 0)); 
$textbox->setBox(
    50, // distance from left edge 
    50, // distance from top edge 
    200, // textbox width 
    100 // textbox height 
); 

// now we have to align the text horizontally and vertically inside the textbox 
$textbox->setTextAlign('center', 'top'); 
// it accepts multiline text 
$textbox->draw("This is\na string of text"); 

Demostración:

demo

+0

He descargado tu código. Funciona perfectamente bien, pero probablemente una de las razones por las que no mucha gente lo está usando es porque tiene y descarga muchas dependencias. su sistema para alinear la caja es más pesado que el cliente y el servidor de mi plataforma juntos. si de alguna manera pudiera funcionar sin el contenido de/vendor /, más como un método independiente o una función, entonces tendría algo grandioso. –

Cuestiones relacionadas