In PHP wird die ImageFontwidth -Funktion verwendet, um die einzelnen Zeichenbreite der integrierten Schriftart zu erhalten. Es gibt die Charakterbreite der Standard -Schriftaufnahme zurück und erleichtert es uns, die Textbreite und das Layout beim Zeichnen von Text mit der GD -Bibliothek zu berechnen. Die Standard- ImageFontwidth unterstützt jedoch nur integrierte Schriftarten mit festen Breiten und bietet nur begrenzte Unterstützung für internationale Charaktere (wie chinesisch, japanisch, koreanisch usw.) und kann seine tatsächliche Breite nicht genau widerspiegeln.
In diesem Artikel wird untersucht, wie die Funktionalität von ImageFontwidth durch Erweiterung oder Anpassung verbessert und die Unterstützung für mehr internationale Charakterbreiten unterstützt wird, wodurch die Genauigkeit und Ästhetik des Textrenders verbessert wird.
ImageFontwidth (int $ font): int
Akzeptieren Sie nur GD-integrierte Schriftzahlen (1 bis 5)
Gibt eine feste Breite zurück und ignoriert den tatsächlichen Inhalt des Charakters
Die Breitenberechnung von Multi-Byte-Zeichen wird nicht unterstützt, und die halbe Breite und die Vollbreite können nicht unterschieden werden.
Zum Beispiel:
<?php
$font = 5;
$width = imagefontwidth($font);
echo "Font $font width is $width pixels.";
?>
Unabhängig davon, ob die Charaktere in englischer oder chinesischer Sprache sind, ist die von ImageFontwidth zurückgegebene Breite dieselbe, was zu Verwirrung von Layout führt.
Um die Breite mehr internationaler Charaktere zu unterstützen, müssen Sie die reine Abhängigkeit von ImageFontwidth umgehen, und die folgenden Lösungen können berücksichtigt werden:
ImagettFBBox kann die Grenzkastengröße der Zeichenfolgen in einer bestimmten TrueType -Schriftart messen. Es ist für mehrsprachige Text geeignet und unterstützt Multi-Byte-Codierung.
Beispiel:
<?php
$fontFile = 'm66.net/fonts/YourFont.ttf'; // Benutzerdefinierte Schriftart
$text = "Hallo,world!";
$fontSize = 16;
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
echo "Text width is $width pixels.";
?>
Auf diese Weise können Sie die Textbreite genau erhalten und die Einschränkungen im Bildfontwidth vermeiden.
Wenn Sie mit der ImageFontwidth -Call -Schnittstelle kompatibel sein müssen, können Sie eine benutzerdefinierte Funktion erstellen, die die entsprechende Breite intern nach dem Charakter -Codierungsbereich zurückgibt.
Beispiel:
<?php
function extendedImageFontWidth(int $font, string $char): int {
// Standardbreite integrierter Schriftarten
$baseWidth = imagefontwidth($font);
// UnicodeCodierung zur Bestimmung der Vollbreite Zeichen
$ord = mb_ord($char, 'UTF-8');
// Gemeinsames Chinesisch、japanisch、Koreanische Charaktere reichen ungefähr
if (($ord >= 0x4E00 && $ord <= 0x9FFF) || // CJK Unified Ideographs
($ord >= 0x3000 && $ord <= 0x303F) || // CJK Symbols and Punctuation
($ord >= 0xFF00 && $ord <= 0xFFEF)) { // Halfwidth and Fullwidth Forms
return $baseWidth * 2; // Angenommen, die Vollbreite Charakterbreite ist zweimal
}
return $baseWidth; // Halbbreite Charaktere
}
// Nutzungsbeispiel
$font = 5;
$char1 = "A";
$char2 = "Du";
echo extendedImageFontWidth($font, $char1) . "\n"; // Zum Beispiel zurückkehren 9
echo extendedImageFontWidth($font, $char2) . "\n"; // zurückkehren 18
?>
Obwohl diese Methode nicht genau genug ist, berücksichtigt sie sowohl Einfachheit als auch bestimmte internationale Unterstützung.
Basierend auf dem obigen Mapping -Schema ist es möglich, die Breite des gesamten Textabsatzes genau zu berechnen:
<?php
function extendedImageFontWidth(int $font, string $char): int {
$baseWidth = imagefontwidth($font);
$ord = mb_ord($char, 'UTF-8');
if (($ord >= 0x4E00 && $ord <= 0x9FFF) ||
($ord >= 0x3000 && $ord <= 0x303F) ||
($ord >= 0xFF00 && $ord <= 0xFFEF)) {
return $baseWidth * 2;
}
return $baseWidth;
}
function getTextWidth(int $font, string $text): int {
$width = 0;
$len = mb_strlen($text, 'UTF-8');
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($text, $i, 1, 'UTF-8');
$width += extendedImageFontWidth($font, $char);
}
return $width;
}
// Beispiel
$font = 5;
$text = "Hello,Welt!";
echo "Text width: " . getTextWidth($font, $text) . " pixels.";
?>
ImageFontwidth ist für integrierte Schriftarten mit fester Breite geeignet und kann die genaue Breite der internationalen Multibyte-Charaktere nicht unterstützen.
Die Kombination von ImagettFBBox und benutzerdefinierter Logik, genauere Informationen zur Schriftbreite können erhalten werden und mehrsprachige Unterstützung.
Durch die Kartierung der Charakterbreite kann vorhandener Code erweitert werden, um die Breite der Schätzung chinesischer und japanischer Zeichen in Chinesisch und Japanisch zu realisieren, was für einfache Szenarien geeignet ist.
In praktischen Anwendungen wird empfohlen, TrueType -Schriftarten und ImagettFBbox zu verwenden, um die Breite der Zeichenfolge zu messen, um den Text -Rendering -Effekt zu verbessern.