Usando PHP GD para crear texto en forma de imagen con diferentes fuentes

He estado usando este sencillo script para generar imágenes a partir de texto:

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

$color = RgbfromHex($_GET['color']);

$text = urldecode($_GET['text']);

$font = 'arial.ttf';

$im = imagecreatetruecolor(400, 30);

$bg_color = imagecolorallocate($im, 255, 255, 255);

$font_color = imagecolorallocate($im, $color[0], $color[1], $color[2]);

imagefilledrectangle($im, 0, 0, 399, 29, $bg_color);

imagettftext($im, 20, 0, 10, 20, $font_color, $font, $text);

imagepng($im);

imagedestroy($im);

function RgbfromHex($hexValue) {
    if(strlen(trim($hexValue))==6) {
        return array(
                     hexdec(substr($hexValue,0,2)), // R
                     hexdec(substr($hexValue,2,2)), // G
                     hexdec(substr($hexValue,4,2))  // B
                    );
    }
    else return array(0, 0, 0);
}

?>

Llamo al script con file.php? Text = testing script & color = 000000

Ahora me gustaría saber cómo podría generar texto con fuentes normales y en negrita mezcladas en la misma imagen, algo como file.php?text=testing <b>script</b>&color=000000


Gracias a dqhendricks por ayudarme a resolver esto.

Aquí hay un guión rápido que escribí, todavía necesita muchas mejoras, pero para la funcionalidad básica parece estar funcionando bien:

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

$color = RgbfromHex($_GET['color']);

$im = imagecreatetruecolor(400, 30);

$white = imagecolorallocate($im, 255, 255, 255);

imagefilledrectangle($im, 0, 0, 399, 29, $white);

$tmp = $_GET['text'];

$words = explode(" ", $tmp);

$x = array(0,0,10); // DUMMY ARRAY WITH X POSITION FOR FIRST WORD

$addSpace = 0;

foreach($words as $word)
{
    if($addSpace) $word = " ".$word; // IF WORD IS NOT THE FIRST ONE, THEN ADD SPACE

    if(stristr($word, "<b>"))
    {
        $font = 'arialbd.ttf'; // BOLD FONT
        $x = imagettftext($im, 20, 0, $x[2], 20, imagecolorallocate($im, $color[0], $color[1], $color[2]), $font, str_replace(array("<b>","</b>"), "", $word));
    }
    else
    {
        $font = 'arial.ttf'; // NORMAL FONT
        $x = imagettftext($im, 20, 0, $x[2], 20, imagecolorallocate($im, $color[0], $color[1], $color[2]), $font, $word);
    }

    $addSpace = 1;
}

imagepng($im);

imagedestroy($im);

function RgbfromHex($hexValue) {
    if(strlen(trim($hexValue))==6) {
        return array(
                     hexdec(substr($hexValue,0,2)), // R
                     hexdec(substr($hexValue,2,2)), // G
                     hexdec(substr($hexValue,4,2))  // B
                    );
    }
    else return array(0, 0, 0);
}

?>

Nota: Esto solo funcionará para palabras sueltas en "negrita" separadas por espacios y no para partes de una palabra en negrita.

Llame al guión con file.php?text=testing+<b>script</b>&color=000000

preguntado el 09 de enero de 11 a las 00:01

Trata roseindia.net/tutorial/php/phpgd/About-boldtext.html parece hacer lo que quieres, es una fuente negra que está encima de la fuente gris, puedes simplemente cambiar la posición de la gris para permitir que se coloquen como quieras. La URL será algo similar a file.php?text=testing&bold=script&color=000000. -

Eso no parece en negrita, sino más como una sombra, y si lo coloco solo uno frente al otro, no creo que se vean diferentes como solo una imagen. -

2 Respuestas

necesitará cargar un archivo de fuente arial-negrita y hacer dos llamadas imagettftext () separadas, una con cada fuente que desee usar. en cuanto a analizar la cadena para averiguar qué partes le gustaría que estén en negrita y dónde debe imprimir cada sección de texto, parece que se convertirá en un código muy complicado. ¿Para qué estás usando esto? puede haber mejores soluciones para lograr lo mismo.

Adición

Utilice el valor de retorno de la función imagettftext () para determinar dónde debe comenzar la siguiente impresión de texto.

De la documentación:

Devuelve una matriz con 8 elementos que representan cuatro puntos que forman el cuadro delimitador del texto. El orden de los puntos es inferior izquierdo, inferior derecho, superior derecho, superior izquierdo. Los puntos son relativos al texto independientemente del ángulo, por lo que "superior izquierda" significa en la esquina superior izquierda cuando ve el texto horizontalmente. Devuelve FALSE en caso de error.

Respondido el 09 de enero de 11 a las 05:01

El análisis no sería un problema, lo que no tengo claro es cómo iba a encontrar la posición X de la segunda wordr en el ejemplo? Texto = script de prueba. Quiero decir, ¿cómo sé dónde termina la primera palabra para poder colocar la segunda allí con otra imagettftext () y una fuente en negrita? - Meredith

Respuesta para:

El análisis no sería un problema, lo que no tengo claro es cómo encontraría la posición X para la segunda palabra en el ejemplo. guión. Quiero decir, ¿cómo sé dónde termina la primera palabra para poder colocar la segunda allí con otra imagettftext () y una fuente en negrita? - Meredith 9 de enero de 11 a las 2:43


Es curioso cómo alguien se tomó el tiempo de decir "ver las ediciones para la respuesta a eso" cuando podría haber dicho simplemente explotar la cadena en los espacios, entonces cada palabra está en una matriz

<?PHP
$sentence = "I LOVE giving retarded answers that don't amount to jack!";
$sentence = explode(" ",$sentence );

for($s=0;$s<count($sentence);$s++){

#THERES YOUR INDIVIDUAL WORDS!
$word = $sentence[$s];

}
?>

Su posición X sería simplemente $ s para su lógica. Para obtener la segunda palabra, puede hacer esto:

<?PHP
$word1 = $sentence[0];
$word2 = $sentence[1];
$word3 = $sentence[2];
$word4 = $sentence[3];
?>

Sí, nombré las palabras $ solo por un efecto visual mental.

$ frase [1] sería la palabra 2

respondido 25 mar '13, 19:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.