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.
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";
Die Probleme treten normalerweise in den folgenden Aspekten auf:
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.
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');
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.
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);
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.
$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.
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
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.