Aktueller Standort: Startseite> Neueste Artikel> Warum gibt ImageFontwidth () immer die falsche Breite zurück?

Warum gibt ImageFontwidth () immer die falsche Breite zurück?

M66 2025-06-04

Bei Verwendung von PHP zum Verarbeiten von Bildern verwenden wir häufig die Funktion imageFontwidth (), um die Zeichenbreite einer bestimmten Schriftgröße zu erhalten, wodurch die genaue Platzholz des Textes im Bild berechnet wird. Viele Entwickler werden jedoch auf ein problematisches Problem stoßen: Die von ImageFontwidth () zurückgegebene Breite stimmt immer nicht mit dem tatsächlichen Anzeigeeffekt überein, was dazu führt, dass die Textposition verwirrt oder abgeschnitten wird. Dieser Artikel analysiert die Ursachen dieses Problems ausführlich und liefert eine zuverlässige Lösung.

Was ist ImageFontwidth () ?

ImageFontwidth (int $ font) ist eine der Funktionen der PHP -GD -Bibliothek, um die Pixelbreite eines Zeichens in einer bestimmten Schriftgröße zu erhalten. Es funktioniert nur mit Bitmap -Schriftarten, die in die GD -Bibliothek eingebaut sind, und die Schriftgröße ist normalerweise ein ganzzahliger Wert (1 bis 5).

Beispielcode:

 $width = imagefontwidth(5);
echo "Die Schriftbreite ist:$width Pixel";

Häufige Missverständnisse und Fehlverhalten

Die Probleme treten normalerweise in den folgenden Aspekten auf:

1. Missverständnis vom Typ Schriftart

ImageFontwidth () gilt nur für integrierte Bitmap-Schriftarten und gilt nicht für TrueType-Schriftarten (TTFs). Viele Entwickler verwenden ImagettFtext () , um TTF -Schriftarten falsch zu machen, und dies führt zwangsläufig zu falschen Ergebnissen.

2. Ignorieren Sie die Gesamtbreite der Zeichen

Selbst wenn Sie integrierte Schriftarten verwenden, denken Sie daran, dass ImageFontwidth () die Breite eines einzelnen Zeichens zurückgibt. Wenn Sie eine gesamte Zeichenfolge rendern, müssen Sie sich mit der Stringlänge multiplizieren:

 $font = 5;
$text = "Hello";
$width = imagefontwidth($font) * strlen($text);

Wenn die Zeichenfolge Multibyte -Zeichen (z. B. Chinesisch) enthält, ist die von Strlen () zurückgegebene Länge ungenau und Sie müssen stattdessen mb_strlen () verwenden:

 $width = imagefontwidth($font) * mb_strlen($text, 'UTF-8');

3.. Schriftart nicht richtig laden

Obwohl die Bitmap -Schriftarten von PHP nicht manuell geladen werden müssen. Wenn Sie einen benutzerdefinierten Schriftart oder eine Systemschrift für Systeme verwenden, können unterschiedliche Rendering -Funktionen gemischt werden, was zu einem Verständnisfehler führt.

Wie bekomme ich die Stringbreite richtig?

Situation 1: Verwenden Sie GD-integrierte Bitmap-Schriftarten

Verwenden Sie ImageFontwidth () direkt, um sicherzustellen, dass die Schriftnummer im Bereich von 1 ~ 5 liegt, und verwenden Sie Strlen () oder mb_strlen () :

 $font = 3;
$text = "Welcome";
$width = imagefontwidth($font) * strlen($text);

Situation 2: Verwenden Sie TrueType -Schriftart

Für TTF -Schriftarten ist ImageFontwidth () ungültig. Sie müssen ImagettFbBox () verwenden, um das Begrenzungsfeld der Zeichenfolge unter die angegebene Schriftart zu erhalten und dann die Breite gemäß den Koordinaten zu berechnen:

 $fontFile = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
$fontSize = 14;
$text = "Welcome";

$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);

In diesem Beispiel gibt $ Bbox ein Array von 8 Elementen zurück, die die vier Ecken des Textrandes darstellen. Die Breite kann durch die Differenz der horizontalen Achse zwischen der oberen rechten Ecke und der oberen linken Ecke berechnet werden.

Beispielanwendung: Dynamisch Bilder mit Text zeichnen

 $img = imagecreate(200, 50);
$bg = imagecolorallocate($img, 255, 255, 255);
$color = imagecolorallocate($img, 0, 0, 0);

$fontFile = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
$text = "Hello World";
$fontSize = 12;

$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$textWidth = abs($bbox[2] - $bbox[0]);

$x = (200 - $textWidth) / 2;
$y = 30;

imagettftext($img, $fontSize, 0, $x, $y, $color, $fontFile, $text);

header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);

Auf diese Weise stellen wir sicher, dass selbst TTF -Schriftarten eine genaue Breite und eine zentrale Position erhalten.

Tipps

  • Mischen Sie Imagestring () und ImagettFtext () nicht: Sie sind für Bitmap- bzw. TTF -Schriftarten geeignet.

  • Das von ImageFontwidth () zurückgegebene Ergebnis wird nicht von DPI -Einstellungen beeinflusst, aber ImagettFBBox () berechnet logische Pixel und wird von Schriftartdateien betroffen.

  • Wenn Sie auf einem anderen Server bereitgestellt werden, bestätigen Sie unbedingt, dass der Schriftart -Dateipfad existiert und zugänglich ist. Zum Beispiel: https://m66.net/fonts/dejavusans.ttf

Zusammenfassen

Wenn ImageFontwidth () die falsche Breite zurückgibt, gelten die meisten Fälle auf die Verwendung inkompatibler Schriftarten oder das Ignorieren des Produkts der Gesamtzahl der Zeichen. Das Verständnis des Umfangs dieser Funktion und die Verwendung von ImagettFBBox () Stattdessen beim Umgang mit TTF -Schriftarten ist der Schlüssel zur Lösung des Problems. Nur durch die korrekte Auswahl der Tools können Sie bei der Verarbeitung von Bildern das gewünschte präzise Layout und die gewünschte Wirkung erhalten.