sábado, 21 de febrero de 2009

Manual de PHP 53. Imágenes: Manejando Fuentes

Utilizando fuentes TrueType

Si has leído los comentarios de la página anterior recordarás que para usar estas funciones es preciso que estén instaladas las librerías FreeType y que, además, conozcamos el path de directorio que contiene las fuentes TrueType.

Instalación de fuentes

Hemos creado un subdirectorio llamado fuentes y lo hemos incluido en directorio donde están alojadas estas páginas.

En ese subdirectorio hemos incluido dos fuentes TrueType manteniendo en una de ellas el nombre original (arial.ttf) y renombrado la otra como fuente2.ttf.

Como podrás comprobar en los ejemplos, no hay problema alguno por el hecho de renombrar las fuentes.

Escribiendo con fuentes TrueType

La función PHP que nos permite insertar este tipo de textos en imágenes dinámicas es la siguiente:

Imagettftext($nom, tam, ang, x, y, $col, $fuente, $txt)

donde:

$nom es, como siempre, el nombre de la imagen.

tam es un número entero que indica el el tamaño de la fuente.

ang es el giro expresado en grados sexagesimales que pretendemos que tenga la cadena de texto. Si ang=0 el texto aparecerá escrito en horizontal.

x e y son las coordenadas del punto de inicio de la inserción del texto. Ese punto coincide con la esquina inferior izquierda del rectángulo imaginario que contiene el texto.

$col es el color a utilizar en el texto.

$fuente es una cadena de texto que contiene el path y el nombre de la fuente. Observa los ejemplos.

$txt es el nombre de la variable que contiene el texto a insertar.

Colocando textos

PHP dispone de una función que permite determinar las dimensiones de una caja de texto (el rectángulo imaginario que rodea el texto).

$rec= ImageTTFBBox (tam, ang, $fuente, $txt)

donde: tam es el tamaño de la fuente a utilizar.

ang es el ángulo de rotación del texto que tendría valor cero en el caso de orientación horizontal.

$fuente es el path y nombre de la fuente a a utilizar.

$txt es el nombre de la variable que contiene el texto a incluir.

La variable $rec recoge un array escalar cuyos valores son las coordenadas de las cuatro esquinas de la caja de texto.

Los índices correspondientes a cada uno de los elementos de ese array son los siguientes:
  • Inferior izquierdo
    Sus coordenadas son:
    $rec[0],$rec[1]

  • Inferior derecho
    Sus coordenadas son:
    $rec[2],$rec[3]

  • Superior derecho
    Sus coordenadas son:
    $rec[4],$rec[5]

  • Superior izquierdo
    Sus coordenadas son:
    $rec[6],$rec[7]
Respecto a estas coordenadas, habremos de tener en cuenta lo siguiente:
  • Las correspondientes al vértice inferior izquierdo son siempre (0,0).

  • Los puntos situados por encima del (0,0) tienen ordenada negativa.

  • Las abscisas de los puntos situados a la izquierda del (0,0) son negativas.

Dibujando segmentos


Aunque presentaremos únicamente el código fuente de una de las imágenes, para hacer la comprobación de las funciones y las diferencias de visualización insertaremos dos ejemplos.
Uno en formato PGN y otro en JPG.


Recuerda que las únicas diferencias entre ambos radican en utilizar: Header("Content-type: image/png") o Header("Content-type: image/jpeg") y en las funciones Imagepng ó Imagejpeg.


Texto TrueType horizontal

<?
Header("Content-type: image/png");
$im = imagecreate(400,300);
$fondo=imagecolorallocate ($im, 255, 255, 210);
$rojo=imagecolorallocate ($im, 255, 0, 0);

$texto="PHP";

Imagettftext($im, 40, 0, 100, 270, $rojo,
"./fuentes/fuente2.ttf", $texto)
;

Imagepng($im);
imagedestroy($im);

?>



Ver img25.php
Formato PNG
Ver img26.php
Formato JPG



Texto TrueType girado

<?
Header("Content-type: image/png");
$im = imagecreate(400,300);
$fondo=imagecolorallocate ($im, 255, 255, 210);
$rojo=imagecolorallocate ($im, 255, 0, 0);

$texto="Me gusta PHP";

Imagettftext($im, 40, 30, 100, 270, $rojo,
"./fuentes/fuente2.ttf", $texto)
;

Imagepng($im);
imagedestroy($im);

?>



Ver img27.php
Formato PNG
Ver img28.php
Formato JPG



Centrando textos


Aquí tienes un ejemplo donde utilizando ImageTTFBox e ImageTTFText se puede centrar un texto -tanto si es horizontal como si está girado- con relación a un punto.


En este ejemplo, el punto de referencia para el centrado es (200,150) que es el centro de la imagen.


Las coordenadas de ImageTTFText, como puedes ver, están calculadas usando las coordenadas de ese punto de referencia y los valores del array generado por ImageTTFBox

.
Si la variable que contiene el array generado por ImageTTFBox se llama $pepa, las coordenadas del centro del rectángulo imaginario son $pepa[4]/2 y $pepa[5]/2


Partiendo de esos valores, si queremos centrar el texto sobre un punto de la imagen cuyas coordenadas son (X,Y) nos basta con escribir como parámetros de la función ImageTTFText los siguientes:

  • Abscisa= X - $pepa[4]/2


  • Abscisa= Y - $pepa[5]/2



Este procedimiento es válido tanto para textos horizontales como para textos girados.


Aquí lo tienes:


&lt?
Header("Content-type: image/png");

$im = imagecreate(400,300);
$fondo=imagecolorallocate ($im, 255, 255, 210);
$gris=imagecolorallocate ($im, 160, 160,160);
$rojo=imagecolorallocate ($im, 255, 0, 0);

$texto="El mundo del PHP";
$texto1="lleno de posibilidades";


$marco= ImageTTFBBox (40, 0, "./fuentes/arial.ttf", $texto);

Imagettftext($im, 40, 0, 200-$marco[4]/2, 150-$marco[5]/2, $gris,
"./fuentes/arial.ttf", $texto);


$marco1= ImageTTFBBox (30, 30, "./fuentes/fuente2.ttf", $texto1);

Imagettftext($im, 30, 30, 200-$marco1[4]/2, 150-$marco1[5]/2, $rojo,
"./fuentes/fuente2.ttf", $texto1);


Imagepng($im);
imagedestroy($im);

?>

Ver img29.php
Formato PNG
Ver img30.php
Formato JPG



Un ejemplo resumen


Aquí tienes un ejemplo bastante completo de generación de imágenes dinámicas.


Ver ejemplo105.php Ver código fuente

En servidores UNIX y LINUX la forma en la que indicamos el path del directorio que contiene las fuentes varía sustancialmente respecto a la que hemos utilizado en estos ejemplos.

En aquellos, además de invertir los separadores, se requiere indicar siempre rutas absolutas, con lo cual habría que hacer las modificaciones oportunas si se tratara de publicar en un hosting que utilice alguno de estos sistemas operativos.




No hay comentarios: