imagettftext

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

imagettftextSchreibt Text mit TrueType-Schriftarten ins Bild

Beschreibung

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

Schreibt den angegebenen text ins Bild unter Verwendung von True-Type-Schriftarten.

Hinweis:

Vor PHP 8.0.0 war imagefttext() eine erweiterte Variante von imagettftext(), die zusätzlich den Parameter extrainfo unterstützte. Ab PHP 8.0.0 ist imagettftext() ein Alias von imagefttext().

Parameter-Liste

image

Ein GdImage-Objekt, das von einer der Funktionen zur Bilderzeugung, z. B. imagecreatetruecolor(), zurückgegeben wurde.

size

Die Schriftgröße in Punkten.

angle

Der Winkel in Grad, wobei 0 Grad einen von links nach rechts zu lesenden Text ergibt. Höhere Werte bewirken eine Drehung gegen den Uhrzeigersinn. Ein Wert von 90 ergibt zum Beispiel einen von unten nach oben zu lesendem Text.

x

Die per x und y angegebenen Koordinaten definieren den Startpunkt des ersten Zeichens (in etwa die linke untere Ecke). Das ist anders als bei der Funktion imagestring(), bei der x und y die obere rechte Ecke des ersten Zeichens darstellen. Zum Beispiel ist oben links 0, 0.

y

Die y-Koordinate. Diese legt die Position der Grundlinie der Schriftart fest, nicht den untersten Rand des Zeichens.

color

Der Farbindex. Die Verwendung des negativen Indexwerts schaltet das Antialiasing ab. Siehe imagecolorallocate().

fontfile

Der Pfad zu der TrueType-Schriftart, die verwendet werden soll.

Der Pfad zu der TrueType-Schriftart, die verwendet werden soll. Abhängig davon, welche Version der GD-Bibliothek PHP verwendet, wird, wenn fontfile nicht mit einem vorangestellten / beginnt, .ttf an den Dateinamen angehängt und die Bibliothek versucht, diesen Dateinamen entlang eines von der Bibliothek definierten Schriftarten-Pfades zu suchen.

Bei der Verwendung von Versionen der GD-Bibliothek, die älter als 2.0.18 sind, wurde ein space-Zeichen, anstelle eines Semikolons als Pfad-Trennzeichen für verschiedene Schriftdateien verwendet. Die unbeabsichtigte Verwendung dieser Eigenschaft führt zu einer Warnmeldung: Warnung: Schriftart konnte nicht gefunden/geöffnet werden. Für diese betroffenen Versionen besteht die einzige Lösung darin, die Schriftart in einen Pfad zu verschieben, der keine Leerzeichen enthält.

In vielen Fällen, in denen sich eine Schriftart im selben Verzeichnis befindet wie das Skript, das sie verwendet, kann der folgende Trick die Probleme beim Einbinden lösen.

<?php
// Setzten der Umgebungsvariablen für GD
putenv('GDFONTPATH=' . realpath('.'));

// Benennen der zu verwendenden Schriftart
// (zu beachten ist das Fehlen der Erweiterung .ttf)
$font = 'IrgendeineSchriftart';
?>

Hinweis:

Zu beachten ist, dass open_basedir nicht für fontfile gilt.

text

Die UTF8-kodierte Text-Zeichenkette.

Kann dezimale numerische Zeichen-Entity-Referenzen (in der Form &#8364;) enthalten, um Zeichen außerhalb des ASCII-Bereichs zu referenzieren. Das hexadizimale Format (wie &#xA9;) wird ebenfalls unterstützt. UTF-8-kodierte Zeichenketten können direkt übergeben werden.

Benannte Zeichen-Entity-Referenzen wie &copy; werden nicht unterstützt. um diese Zeichen-Entity-Referenzen nach UTF-8 zu konvertieren, kann html_entity_decode() verwendet werden.

Wenn ein Zeichen in der Zeichenkette verwendet wird, das von der Schriftart nicht untersützt wird, wird es durch ein hohles Rechteck ersetzt.

Rückgabewerte

Gibt ein Array mit 8 Elementen zurück, die die vier Punkte des umgebenden Rechtecks des Textes repräsentieren. Die Reihenfolge der Punkte ist unten links, unten rechts, oben rechts und oben links. Die Punkte sind relativ zum Text, unabhängig vom Winkel, sodass "obere linke Ecke" bedeutet "in der oberen linken Ecke, wenn der Text horizontal gesehen wird". Im Fehlerfall wird false zurückgegeben.

Changelog

Version Beschreibung
8.0.0 Die options wurden hinzugefügt.

Beispiele

Beispiel #1 imagettftext()-Beispiel

Dieses Beispielskript erzeugt ein weißes 400x30 Pixel großes PNG mit dem Text "Testing..." in schwarz (mit grauem Schatten) in der Schriftart Arial.

<?php

// Setze den Content-Type
header('Content-Type: image/png');

// Erzeuge das Bild
$im = imagecreatetruecolor(400, 30);

// Erzeuge einige Farben
$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);

// Der zu zeichnende Text
$text = 'Testing...';

// Bei Bedarf ist der Pfad anzupassen
$font = 'arial.ttf';

// Füge etwas Schatten zum Text hinzu
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);

// Füge den Text hinzu
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

// Die Verwendung von imagepng() ergibt eine bessere Textqualität als imagejpeg()
imagepng($im);

?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Ausgabe des Beispiels: imagettftext()

Anmerkungen

Hinweis: Diese Funktion ist nur verfügbar wenn PHP mit Freetype unterstützung (--with-freetype-dir=DIR) kompiliert wurde

Siehe auch

  • imagettfbbox() - Ermittelt das umgebende Rechteck eines Textes, der eine TrueType-Schriftart verwendet
  • imagefttext() - Write text to the image using fonts using FreeType 2
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