Start · Sprachen · PHP · Referenz · imagefttext

imagefttext

Funktion

Schreibt Text mit einer FreeType-2-Schriftdatei in ein GD-Bild und gibt die Begrenzungsrahmen-Koordinaten zurück.

seit PHP 4.0.7 Kategorie: image

Signatur

imagefttext(GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text, array $extrainfo = []): array|false

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

Typ
array|false
Beschreibung
Bei Erfolg ein Array mit 8 Ganzzahlen, das die vier Ecken der Bounding Box beschreibt (im Uhrzeigersinn ab unten links): [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);
Bounding Box: 20, 60, 194, 60, 194, 40, 20, 40

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.