Laravel Live Denmark 2026

imagettftext

(PHP 4, PHP 5, PHP 7, PHP 8)

imagettftextDibuja un texto con una fuente TrueType

Descripción

imagettftext(
    GdImage $image,
    float $size,
    float $angle,
    int $x,
    int $y,
    int $color,
    string $font_filename,
    string $text,
    array $options = []
): array|false

imagettftext() dibuja el texto text con la fuente TrueType fontfile.

Nota:

Antes de PHP 8.0.0, imagefttext() era una variante extendida de imagettftext() que además soporta extrainfo. A partir de PHP 8.0.0, imagefttext() es un alias de imagefttext().

Parámetros

image

Un objeto GdImage, retornado por una de las funciones de creación de imágenes, como imagecreatetruecolor().

size

The font size in points.

angle

El ángulo, en grados; 0 grados corresponde a la lectura del texto de izquierda a derecha. Los valores positivos representan una rotación en el sentido contrario a las agujas de un reloj. Por ejemplo, un valor de 90 corresponderá a una lectura del texto de abajo hacia arriba.

x

Las coordenadas dadas por x y y definirán la posición del primer carácter (la esquina inferior izquierda del carácter). Esto es diferente de la función imagestring(), donde x y y definen la esquina superior izquierda del primer carácter. Por ejemplo, "superior izquierda" corresponde a 0, 0.

y

La coordenada Y. Esto define la posición de la línea base de la fuente, y no el fondo de los caracteres.

color

El índice del color. Utilizar un índice de color negativo desactivará el antialiasing. Ver la función imagecolorallocate().

fontfile

La ruta de acceso al fichero de la fuente TrueType que desea utilizar.

Dependiendo de qué versión de la biblioteca GD esté utilizando PHP, cuando fontfile no comienza con una barra diagonal inicial / entonces .ttf será añadido al nombre del fichero y la biblioteca intentará buscar ese nombre de fichero a lo largo de una ruta de acceso de fuentes definida por la biblioteca.

Al utilizar versiones de la biblioteca GD inferiores a 2.0.18, un carácter espacio, en lugar de un punto y coma, se utilizaba como 'separador de rutas' para diferentes ficheros de fuentes. El uso no intencional de esta característica resultará en el mensaje de advertencia: Advertencia: No se pudo encontrar/abrir la fuente. Para estas versiones afectadas, la única solución es mover la fuente a una ruta que no contenga espacios.

En muchos casos donde una fuente reside en el mismo directorio que el script que la utiliza, el siguiente truco aliviará cualquier problema de inclusión.

<?php
// Establecer la variable de entorno para GD
putenv('GDFONTPATH=' . realpath('.'));
// Nombre de la fuente a ser utilizada (note la falta de la extensión .ttf)
$font = 'SomeFont';
?>

Nota:

Tenga en cuenta que open_basedir no aplica a fontfile.

text

La cadena de texto, en UTF-8.

Puede incluir referencias a caracteres numéricos, decimales (en la forma: &#8364;) para acceder a los caracteres de una fuente más allá del primer 127. El formato hexadecimal (como &#xA9;) es soportado. Las cadenas de caracteres codificadas en UTF-8 pueden ser pasadas directamente.

Las entidades nombradas, como &copy;, no son soportadas. Utilice la función html_entity_decode() para codificar estas entidades nombradas en cadena UTF-8.

Si un carácter es utilizado en una cadena que no es soportada por la fuente, un rectángulo hueco reemplazará el carácter.

options

Un array con una clave linespacing que contiene un valor float.

Valores devueltos

Devuelve un array de 8 elementos que representan cuatro puntos que marcan los límites del texto. El orden de los puntos es: inferior izquierdo, inferior derecho, superior derecho, superior izquierdo. Los puntos son relativos al texto con respecto al ángulo, por lo que, "superior izquierdo" significa en la esquina superior izquierda cuando se mira el texto horizontalmente. Devuelve false si ocurre un error.

Historial de cambios

Versión Descripción
8.0.0 El parámetro options ha sido añadido.

Ejemplos

Ejemplo #1 Ejemplo con imagettftext()

Este ejemplo producirá una imagen PNG blanca de 400x30 píxeles, con el texto "Test..." en negro, con una sombra gris, utilizando la fuente Arial.

<?php

// Definición del content-type
header('Content-Type: image/png');

// Creación de la imagen
$im = imagecreatetruecolor(400, 30);

// Creación de algunos colores
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);

// El texto a dibujar
$text = 'Test...';

// Reemplazar la ruta por su propia ruta de fuente
$font = 'arial.ttf';

// Añadir sombras al texto
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);

// Añadir el texto
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

// Utilizar imagepng() dará un texto más claro,
// comparado con el uso de la función imagejpeg()
imagepng($im);

?>

Resultado del ejemplo anterior es similar a:

Visualización del ejemplo: imagettftext()

Notas

Nota: Esta función solo está disponible si si PHP es compilado con soporte Freetype (--with-freetype-dir=DIR)

Ver también

  • imagettfbbox() - Devuelve el rectángulo que rodea un texto dibujado con una fuente TrueType
  • imagefttext() - Escribe texto en una imagen con la fuente actual FreeType 2
  • imagestring() - Dibuja una cadena horizontal
add a note

User Contributed Notes 7 notes

up
52
Valentijn de Pagter
17 years ago
If you're looking for easy text alignment, you need to use the imagettfbbox() command. When given the correct parameters, it will return the boundaries of your to-be-made text field in an array, which will allow you to calculate the x and y coordinate that you need to use for centering or aligning your text.

A horizontal centering example:

<?php

$tb = imagettfbbox(17, 0, 'airlock.ttf', 'Hello world!');

?>

$tb would contain:

Array
(
    [0] => 0 // lower left X coordinate
    [1] => -1 // lower left Y coordinate
    [2] => 198 // lower right X coordinate
    [3] => -1 // lower right Y coordinate
    [4] => 198 // upper right X coordinate
    [5] => -20 // upper right Y coordinate
    [6] => 0 // upper left X coordinate
    [7] => -20 // upper left Y coordinate
)

For horizontal alignment, we need to substract the "text box's" width { $tb[2] or $tb[4] } from the image's width and then substract by two.

Saying you have a 200px wide image, you could do something like this:

<?php

$x = ceil((200 - $tb[2]) / 2); // lower left X coordinate for text
imagettftext($im, 17, 0, $x, $y, $tc, 'airlock.ttf', 'Hello world!'); // write text to image

?>

This'll give you perfect horizontal center alignment for your text, give or take 1 pixel. Have fun!
up
12
suyog at suyogdixit dot com
12 years ago
For your general edification: The following drop-in function will place a block of fully justified text onto a GD image. It is a little CPU heavy, so I suggest caching the output rather than doing it on-the-fly. 

Arguments: 

$image - the GD handle of the target canvas 
$size - text size 
$angle - slope of text (does not work very well), leave at 0 for horizontal text 
$left - no. of pixels from left to start block 
$top - no. of pixels from top to start block 
$color - handle for colour (imagecolorallocate result) 
$font - path to .ttf font 
$text - the text to wrap and justify 
$max_width - the width of the text block within which the text should be wrapped and fully justified 
$minspacing - the minimum number of pixels between words 
$linespacing - a multiplier of line height (1 for normal spacing; 1.5 for line-and-a-half etc.)

eg.
$image = ImageCreateFromJPEG( "sample.jpg" );
$cor = imagecolorallocate($image, 0, 0, 0);
$font = 'arial.ttf';
$a = imagettftextjustified($image, 20, 0, 50, 50, $color, $font, "Shree", 500, $minspacing=3,$linespacing=1);
header('Content-type: image/jpeg');
imagejpeg($image,NULL,100);

function imagettftextjustified(&$image, $size, $angle, $left, $top, $color, $font, $text, $max_width, $minspacing=3,$linespacing=1)
{
$wordwidth = array();
$linewidth = array();
$linewordcount = array();
$largest_line_height = 0;
$lineno=0;
$words=explode(" ",$text);
$wln=0;
$linewidth[$lineno]=0;
$linewordcount[$lineno]=0;
foreach ($words as $word)
{
$dimensions = imagettfbbox($size, $angle, $font, $word);
$line_width = $dimensions[2] - $dimensions[0];
$line_height = $dimensions[1] - $dimensions[7];
if ($line_height>$largest_line_height) $largest_line_height=$line_height;
if (($linewidth[$lineno]+$line_width+$minspacing)>$max_width)
{
$lineno++;
$linewidth[$lineno]=0;
$linewordcount[$lineno]=0;
$wln=0;
}
$linewidth[$lineno]+=$line_width+$minspacing;
$wordwidth[$lineno][$wln]=$line_width;
$wordtext[$lineno][$wln]=$word;
$linewordcount[$lineno]++;
$wln++;
}
for ($ln=0;$ln<=$lineno;$ln++)
{
$slack=$max_width-$linewidth[$ln];
if (($linewordcount[$ln]>1)&&($ln!=$lineno)) $spacing=($slack/($linewordcount[$ln]-1));
else $spacing=$minspacing;
$x=0;
for ($w=0;$w<$linewordcount[$ln];$w++)
{
imagettftext($image, $size, $angle, $left + intval($x), $top + $largest_line_height + ($largest_line_height * $ln * $linespacing), $color, $font, $wordtext[$ln][$w]);
$x+=$wordwidth[$ln][$w]+$spacing+$minspacing;
}
}
return true;
}
up
5
gav-alex at bk dot ru
20 years ago
Hi all!
When my hoster updated his php's libs at first minutes i've got the same problem as some of you.
Php couldn't find the path to true type fonts.
The solution in my case was to make the path look like this
<?php
imagettftext($im, 20, 0, 620, 260, $secondary_color, "./tahoma.ttf" , "NEWS");
?>
so as you can see i simply added "./"

another tip that i wanted to add here is how to write in RUssian on image using imagettftext
you simply have to change the function argument like this
<?php
imagettftext($im, 15, 0, 575, 300, $secondary_color, "./tahoma.ttf" , win2uni("some word in russian"));
 ?>
where win2uni is the function that converts win1251 to unicode. here is the code of it
<?php 

  //  Windows 1251 -> Unicode
  function win2uni($s)
  {
    $s = convert_cyr_string($s,'w','i'); //  win1251 -> iso8859-5
    //  iso8859-5 -> unicode:
    for ($result='', $i=0; $i<strlen($s); $i++) {
      $charcode = ord($s[$i]);
      $result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
    }
    return $result;
  }
?>

That's all today! Thanks for your attention!
Alex
up
2
mitch at electricpulp dot com
18 years ago
If you're having issues with fonts not working... (Could not find/open font) check your permissions on the folder/font files and make sure they're 775, especially if you've just pulled them from a windows box. Hope this helps!
up
2
s.pynenburg _at_ gm ail dotcom
17 years ago
I had an image generator where the user could position where they wanted the text to begin - however it kept going off the side of an image. So I made this basic function: it measures if the inputted text and x-position will cause the string to go off the edge, and if so, it will fit as much as it can on the first line, then go down to the next one.
Limitations:
-It only performs this once (i.e. it won't split into three lines)
-I'm pretty sure it won't work with angled text.

<?PHP

function imagettftextwrap($im, $size, $angle, $x_pos, $y_pos, $color, $font, $instr)
{
    $box = @imagettfbbox($size, 0, $font, $instr);
    $width = abs($box[4] - $box[0]);
    $height = abs($box[3] - $box[5]);
    $overlap = (($x_pos + $width) - imagesx($im));
    if($overlap > 0) //if the text doesn't fit on the image
    {
        $chars = str_split($instr);
        $str = "";
        $pstr = "";
        for($m=0; $m < sizeof($chars); $m++)
        {
            $bo = imagettfbbox($fsize1, 0, $font1, $str);
            $wid = abs($bo[4] - $bo[0]);
            if(($x_pos + $wid) < imagesx($im)) //add one char from the string as long as it's not overflowing
            {
                $pstr .= $chars[$m];
                $bo2 = imagettfbbox($fsize1, 0, $font1, $pstr);
                $wid2 = abs($bo2[4] - $bo2[0]);
                if(($x_pos + $wid2) < imagesx($im))
                {
                    $str .= $chars[$m];
                }    
                else
                {
                    break;
                }
            }
            else
            {
                break;
            }
        }
        $restof = "";
        for($l=$m; $l < sizeof($chars); $l++)
        {
            $restof .= $chars[$l]; //add the rest of the string to a new line
        }
        imagettftext($im, $size, $angle, $x_pos, $y_pos, $color, $font, $str); // print out the smaller line
        imagettftext($im, $size, $angle, 0, $y_pos + $height, $color, $font, $restof); //and the rest of it
    }
    else
    {
        imagettftext($im, $size, $angle, $x_pos, $y_pos, $color, $font, $instr); //otherwise just do normally
    }

}

?>
up
3
pillepop2003 at nospam dot yahoo dot de
21 years ago
Hey guys,

check this function if you want to rotate the text around its center and not its "lower left" pivot-point:

<?php
        // Put center-rotated ttf-text into image
        // Same signature as imagettftext();
        function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text)
        {
            // retrieve boundingbox
            $bbox = imagettfbbox($size, $angle, $fontfile, $text);
            
            // calculate deviation
            $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0;         // deviation left-right
            $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0;        // deviation top-bottom
            
            // new pivotpoint
            $px = $x-$dx;
            $py = $y-$dy;
            
            return imagettftext($im, $size, $angle, $px, $py, $color, $fontfile, $text);
        }

?>

Big up
Phil
up
3
philip at webdesco dot com
16 years ago
Hi,
for the dummies (like myself) if you are having problems including your font file, prefix the file name with ./

On my development server the following worked fine
$myfont = "coolfont.ttf";

on my hosting server the only way i could get the font to work was as follows
$myfont = "./coolfont.ttf";

hope this helps someone out!
To Top