2012-07-27 20 views
13

Ich versuche einfach, die Breite einer dynamischen Textzeile für ein Bild mit GD PHP zu ergänzen. Ich bin ein bisschen unsicher wie. Ich weiß, wie man eine Schriftart mit imageladfont() lädt, aber kann ich eine .ttf-Datei verwenden? Ich möchte die Breite des Textes mit Größe 12 Arial Schriftart wissen. Wenn ich versuche, meine ttf-Datei zu verwenden, erhalte ich die Fehlermeldung "Fehler beim Lesen der Schriftart, ungültiger Schriftkopf". Wenn ich eine .gdf-Datei benötige, wo finde ich eine 12-fache Schriftgröße? Hier ist mein Code:Berechnung der Textbreite mit PHP GD

$newfont = imageloadfont("../fonts/arial.ttf"); 
$font_width = imagefontwidth($newfont); 
$font_height = imagefontheight($newfont); 
+2

Take a siehe [imagettfbbox] (http://www.php.net/manual/en/function.imagettfbbox.php) und [imagettftext] (http://php.net/manual/en/function.imagefttext.php). – Vatev

Antwort

33

imageloadfont() verwendet benutzerdefinierte Bitmaps zu laden. Wenn Sie nur Arial oder andere TrueType-Fonts (.ttf) oder OpenType-Fonts (.otf) verwenden möchten (die Unterstützung für letzteres in GD lib ist fehlerhaft), dann brauchen Sie imagettftext(). Bevor Sie jedoch imagettftext() verwenden und Text in Ihr Bild schreiben, müssen Sie zuerst wissen, ob es passt. Um dies zu wissen, müssen Sie einfach imagettfbbox() anrufen und ihm die Schriftgröße, den Winkel des Textes (0 für horizontalen Text), den Pfad zu Ihrer .ttf oder .otf Schriftdatei und die Textzeichenfolge selbst übergeben und es wird ein zurückgegeben Array mit 8 Elementen, die vier Punkte repräsentieren, die die Begrenzungsbox des Textes bilden (siehe PHP Handbuch für Besonderheiten). Sie können dann auf diese Array-Elemente verweisen und Berechnungen durchführen, um die Breite und Höhe zu ermitteln, die diese bestimmte Textfolge belegen wird. Sie können diese Werte dann verwenden, um ein Bild mit einer bestimmten Breite und Höhe zu erstellen, sodass der Text vollständig angezeigt werden kann.

Hier ist ein einfaches Skript, das vollbringt, was Sie versuchen zu tun, um Ihnen den Einstieg:

<?php # Script 1 

/* 
* This page creates a simple image. 
* The image makes use of a TrueType font. 
*/ 

// Establish image factors: 
$text = 'Sample text'; 
$font_size = 12; // Font size is in pixels. 
$font_file = 'Arial.ttf'; // This is the path to your font file. 

// Retrieve bounding box: 
$type_space = imagettfbbox($font_size, 0, $font_file, $text); 

// Determine image width and height, 10 pixels are added for 5 pixels padding: 
$image_width = abs($type_space[4] - $type_space[0]) + 10; 
$image_height = abs($type_space[5] - $type_space[1]) + 10; 

// Create image: 
$image = imagecreatetruecolor($image_width, $image_height); 

// Allocate text and background colors (RGB format): 
$text_color = imagecolorallocate($image, 255, 255, 255); 
$bg_color = imagecolorallocate($image, 0, 0, 0); 

// Fill image: 
imagefill($image, 0, 0, $bg_color); 

// Fix starting x and y coordinates for the text: 
$x = 5; // Padding of 5 pixels. 
$y = $image_height - 5; // So that the text is vertically centered. 

// Add TrueType text to image: 
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_file, $text); 

// Generate and send image to browser: 
header('Content-type: image/png'); 
imagepng($image); 

// Destroy image in memory to free-up resources: 
imagedestroy($image); 

?> 

ändern Werte entsprechend Ihren Bedürfnissen passen. Vergessen Sie nicht, das PHP-Handbuch zu lesen.

+2

Große Antwort .. +1 –

+0

Sorry, aber [** dieses Ding funktioniert nicht **] (http://i.stack.imgur.com/54yoj.png). Dies ist, was es mit dem Text '666' '(oder irgendeine andere Zahl AFAIK) und Courier New Schriftart erzeugt. Es funktioniert auch nicht wirklich mit anderen Schriftarten - schneidet immer etwas hier und da. Ich verstehe, dass es nicht deine Schuld ist, dass Leute hinter PHP inkompetent sind, aber immer noch einen Downvote. –

+0

[Ein anderes Beispiel] (http://i.stack.imgur.com/tYJV7.png) wo ich hervorgehoben habe, was falsch ist. –

1

Mit GD2, der imagettfbbox ‚s Schriftgröße muß mit der folgenden convert in PTs, nicht in Pixel sein:

($ fontSizeInPixel * 3)/4