Signatur
Beschreibung
imagefttext() rendert einen Textstring in ein GD-Bildobjekt unter Verwendung einer TrueType- oder OpenType-Schriftdatei über die FreeType-2-Bibliothek. Im Gegensatz zur älteren imagettftext() bietet diese Funktion den optionalen Parameter $extrainfo, über den erweiterte Rendering-Optionen wie Kerning-Anpassungen übergeben werden können.
Der Text wird ausgehend von der angegebenen Basislinien-Position ($x, $y) in der angegebenen Schriftgröße und dem angegebenen Winkel gezeichnet. Der Rückgabewert ist ein Array mit acht Ganzzahlen, die die vier Ecken des umschließenden Rechtecks (Bounding Box) des gerenderten Textes beschreiben – nützlich für die genaue Positionierung oder Kollisionserkennung.
Die Funktion eignet sich überall dort, wo dynamisch Text mit individuellen Schriften auf Bilder gezeichnet werden soll, etwa bei der Generierung von Bannern, Captchas, Wasserzeichen oder Infografiken. Die Schriftdatei kann als absoluter Pfad oder relativ zu einem konfigurierten Verzeichnis angegeben werden.
Voraussetzung ist, dass PHP mit FreeType-2-Unterstützung kompiliert wurde (Option --with-freetype). Ohne diese Unterstützung steht die Funktion nicht zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $image Pflicht | GdImage | Das GD-Bildobjekt, in das der Text gezeichnet wird. Wird typischerweise von imagecreatetruecolor() oder ähnlichen Funktionen zurückgegeben. |
|
| $size Pflicht | float | Die Schriftgröße in Punkten (pt). Dezimalwerte sind erlaubt, z. B. 12.5. |
|
| $angle Pflicht | float | Der Winkel in Grad, um den der Text gegen den Uhrzeigersinn rotiert wird. 0 bedeutet horizontalen Text, 90 kippt ihn um 90 Grad nach links. |
|
| $x Pflicht | int | Die X-Koordinate des Startpunkts der Textbasislinie in Pixeln (von links). | |
| $y Pflicht | int | Die Y-Koordinate der Textbasislinie in Pixeln (von oben). Oberlängen ragen nach oben über diesen Punkt hinaus. | |
| $color Pflicht | int | Der Farbindex, wie er von imagecolorallocate() oder imagecolorallocatealpha() zurückgegeben wird. Mit einem negativen Wert wird der Text gezeichnet und Anti-Aliasing deaktiviert. |
|
| $fontfile Pflicht | string | Absoluter oder relativer Pfad zur TrueType- oder OpenType-Schriftdatei (.ttf oder .otf). Unter Windows können Pfade mit Schrägstrichen Probleme verursachen; Backslashes sind sicherer. |
|
| $text Pflicht | string | Der zu zeichnende Text. UTF-8-kodierte Zeichenketten werden unterstützt, sodass auch Umlaute, Sonderzeichen und nicht-lateinische Schriften gerendert werden können, sofern die Schriftdatei diese Zeichen enthält. | |
| $extrainfo | array | [] | Optionales assoziatives Array für erweiterte FreeType-Parameter. Unterstützt wird z. B. der Schlüssel 'linespacing' (float) zur Steuerung des Zeilenabstands bei mehrzeiligem Text. |
Rückgabewert
[x0, y0, x1, y1, x2, y2, x3, y3]. Gibt false zurück, wenn ein Fehler auftritt (z. B. Schriftdatei nicht gefunden oder FreeType nicht verfügbar).Beispiele
Einfacher Text auf ein Bild schreiben
<?php
// Bild erstellen
$image = imagecreatetruecolor(400, 100);
// Farben definieren
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
// Hintergrund weiß füllen
imagefill($image, 0, 0, $white);
// Pfad zur Schriftdatei (anpassen!)
$font = '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf';
// Text schreiben
$bbox = imagefttext($image, 20, 0, 20, 60, $black, $font, 'Hallo, Welt!');
if ($bbox === false) {
echo 'Fehler beim Rendern des Textes.';
} else {
// Bounding Box ausgeben
echo 'Bounding Box: ' . implode(', ', $bbox) . PHP_EOL;
// Bild als PNG ausgeben
header('Content-Type: image/png');
imagepng($image);
}
imagedestroy($image);
Rotierter Text als Wasserzeichen
<?php
// Vorhandenes Bild laden
$image = imagecreatefromjpeg('foto.jpg');
if (!$image) {
die('Bild konnte nicht geladen werden.');
}
// Halbtransparente Farbe für Wasserzeichen
$color = imagecolorallocatealpha($image, 255, 255, 255, 80);
$font = '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf';
// Text um 45 Grad rotiert in die Bildmitte schreiben
$text = '© Mein Unternehmen';
$x = (int)(imagesx($image) / 2);
$y = (int)(imagesy($image) / 2);
imagefttext($image, 24, 45, $x, $y, $color, $font, $text);
header('Content-Type: image/jpeg');
imagejpeg($image, null, 90);
imagedestroy($image);
Bounding Box zur Zentrierung nutzen
<?php
$width = 500;
$height = 150;
$image = imagecreatetruecolor($width, $height);
$bg = imagecolorallocate($image, 30, 30, 30);
$text_color = imagecolorallocate($image, 255, 220, 0);
imagefill($image, 0, 0, $bg);
$font = '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf';
$text = 'Zentrierter Titel';
$size = 28;
// Bounding Box ohne echtes Zeichnen ermitteln
$bbox = imageftbbox($size, 0, $font, $text);
$text_width = $bbox[2] - $bbox[0];
$text_height = $bbox[1] - $bbox[7];
$x = (int)(($width - $text_width) / 2);
$y = (int)(($height + $text_height) / 2);
imagefttext($image, $size, 0, $x, $y, $text_color, $font, $text);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
// Wichtig · Fallstricke
Sicherheit: Wenn der $fontfile-Pfad aus Benutzereingaben stammt, muss er unbedingt validiert und auf ein erlaubtes Verzeichnis beschränkt werden, um Path-Traversal-Angriffe (../../etc/passwd) zu verhindern. Ebenso sollte $text aus Fremdquellen bereinigt werden, auch wenn GD selbst keinen Code ausführt.
UTF-8: Die Funktion erwartet UTF-8-kodierten Text. Liegt der Text in einer anderen Kodierung vor (z. B. ISO-8859-1), sollte er vorher mit mb_convert_encoding() oder utf8_encode() konvertiert werden.
Ähnlichkeit zu imagettftext(): imagefttext() und imagettftext() sind nahezu identisch. Der einzige praktische Unterschied ist der optionale $extrainfo-Parameter. Beide Funktionen nutzen intern FreeType 2.
FreeType-Verfügbarkeit: Steht die Funktion nicht zur Verfügung, wurde PHP ohne FreeType-2-Unterstützung kompiliert. Dies lässt sich mit phpinfo() oder function_exists('imagefttext') prüfen.