Aktueller Standort: Startseite> Neueste Artikel> Wie Verwenden Sie die ImageFontwidth -Funktion, um Informationen zu der Schriftbreite zu erweitern, um die Anzeige weiterer internationaler Zeichen zu unterstützen?

Wie Verwenden Sie die ImageFontwidth -Funktion, um Informationen zu der Schriftbreite zu erweitern, um die Anzeige weiterer internationaler Zeichen zu unterstützen?

M66 2025-06-11

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.


1. Einschränkungen der ImageFontwidth -Funktion

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.


2. Erweitern Sie die Lösungsideen

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:

2.1 Verwenden benutzerdefinierter Schriftart Dateien und ImagettFBBox -Funktionen

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.

2.2 simulieren Sie ImageFontwidth durch Mapping -Tabelle

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.


3.. Kombinieren Sie die erweiterte Breite, um eine vollständige Berechnung der Textbreite zu erzielen

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.";
?>

4. Zusammenfassung

  • 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.