2011-01-09 20 views
6

He estado usando este sencillo script para generar imágenes de texto:?Uso de PHP GD para crear texto forma de imagen con diferentes fuentes

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

?> 

que llamo el guión con el texto archivo.php = script de prueba de color & = 000000

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


Gracias a dqhendricks por ayudarme a resolver esto.

Aquí es una secuencia de comandos rápida 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 sólo funcionará para "negrita" palabras individuales separadas por espacios y no por negrita parte de una palabra.

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

+0

Trate http://www.roseindia.net/tutorial/php/phpgd/About-boldtext.html parece hacer lo que quiere, que es la fuente que es negro encima de la fuente gris, puede cambiar la posición de la gris para permitir que se coloque a su gusto. La URL será algo similar a 'file.php? Text = testing & bold = script & color = 000000'. – Daniel

+0

Eso no se ve como negrita, sino más bien como una sombra, y si la coloco una frente a la otra, no creo que parezcan diferentes como solo una imagettftext(). – Meredith

Respuesta

0

tendrá que cargar un archivo de fuente Arial negrita, y hacer dos imagettftext separada() llama, uno con cada fuente que desea utilizar. en cuanto a analizar la cadena para descubrir qué partes le gustaría ser audaz, y dónde debe imprimir cada sección de texto, esto parece que se convertirá en código muy complicado. ¿para qué estás usando esto? puede haber mejores soluciones para lograr lo mismo.

adición

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

De la documentación:

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

+1

El análisis no sería un problema, lo que no tengo claro es cómo encontraría la posición X para el segundo wordr en el ejemplo? Text = testing script. Quiero decir cómo sé dónde termina la primera palabra para poder ubicar la segunda con otro imagettftext() y una fuente en negrita. – Meredith

+0

ver las ediciones de la respuesta a eso. – dqhendricks

+0

Eso es genial, muchas gracias. – Meredith

-1

Respuesta para:

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 de texto = prueba guión?. Quiero decir cómo sé dónde termina la primera palabra para poder ubicar la segunda con otro imagettftext() y una fuente en negrita. - Meredith Ene '11 9 a 2:43


curioso cómo alguien se tomó el tiempo para decir "ver las ediciones de la respuesta a eso" cuando COULDA acaba de decir a 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.

$ condena [1] sería la palabra 2

Cuestiones relacionadas