Dans PHP, la fonction ImageFontWidth est utilisée pour obtenir la largeur de caractères unique de la police intégrée. Il renvoie la largeur des caractères de la collection de polices par défaut, ce qui nous permet de calculer plus facilement la largeur du texte et la mise en page lors du dessin de texte à l'aide de la bibliothèque GD. Cependant, l' imagefontwidth par défaut ne prend en charge que les polices intégrées avec des largeurs fixes, et a un support limité pour les caractères internationaux (comme le chinois, le japonais, le coréen, etc.) et ne peut pas refléter avec précision sa largeur réelle.
Cet article explorera comment améliorer les fonctionnalités de l'imagefontwidth par l'extension ou la personnalisation, et obtenir un support pour plus de largeurs de caractères internationales, améliorant ainsi la précision et l'esthétique du rendu de texte.
ImageFontWidth (int $ font): int
Acceptez uniquement les numéros de police intégrés GD (1 à 5)
Renvoie une largeur fixe, ignorant le contenu réel du personnage
Le calcul de la largeur des caractères multi-octets n'est pas pris en charge, et les caractères à demi-largeur et pleine largeur ne peuvent pas être distingués.
Par exemple:
<?php
$font = 5;
$width = imagefontwidth($font);
echo "Font $font width is $width pixels.";
?>
Que les personnages soient en anglais ou en chinois, la largeur renvoyée par ImageFontWidth est la même, ce qui entraînera la confusion de mise en page.
Pour soutenir la largeur des caractères plus internationaux, vous devez contourner la pure dépendance de l'imagefontwidth , et les solutions suivantes peuvent être prises en compte:
Imagettfbbox peut mesurer la taille de la boîte limite des chaînes dans un fichier de police TrueType spécifié. Il convient au texte multilingue et prend en charge le codage multi-octets.
Exemple:
<?php
$fontFile = 'm66.net/fonts/YourFont.ttf'; // Chemin de police personnalisé
$text = "Bonjour,world!";
$fontSize = 16;
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
echo "Text width is $width pixels.";
?>
Cela vous permet d'obtenir avec précision la largeur du texte et d'éviter les limitations d'image de laWidth .
Si vous devez être compatible avec l'interface d'appel ImageFontWidth , vous pouvez créer une fonction personnalisée qui renvoie la largeur correspondante en interne en fonction de la plage de codage des caractères.
Exemple:
<?php
function extendedImageFontWidth(int $font, string $char): int {
// Largeur standard des polices intégrées
$baseWidth = imagefontwidth($font);
// UnicodeEncodage pour déterminer les caractères pleine largeur
$ord = mb_ord($char, 'UTF-8');
// Chinois commun、japonais、Les personnages coréens vont grossièrement
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; // Supposons que la largeur de caractère pleine largeur est deux fois
}
return $baseWidth; // Personnages de demi-largeur
}
// Exemple d'utilisation
$font = 5;
$char1 = "A";
$char2 = "toi";
echo extendedImageFontWidth($font, $char1) . "\n"; // Par exemple, retour 9
echo extendedImageFontWidth($font, $char2) . "\n"; // retour 18
?>
Bien que cette méthode ne soit pas suffisamment exacte, elle prend en compte à la fois la simplicité et certains supports internationaux.
Sur la base du schéma de mappage ci-dessus, il est possible de calculer avec précision la largeur de l'ensemble du paragraphe de texte:
<?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;
}
// Exemple
$font = 5;
$text = "Hello,monde!";
echo "Text width: " . getTextWidth($font, $text) . " pixels.";
?>
ImageFontWidth convient aux polices intégrées à largeur fixe et ne peut pas prendre en charge la largeur exacte des caractères internationaux multi -yte.
En combinant Imagettfbbox et une logique personnalisée, des informations plus précises de largeur de police peuvent être obtenues et un support multilingue.
Grâce à la cartographie de la largeur des caractères, le code existant peut être étendu pour réaliser une estimation de la largeur des caractères chinois et japonais en chinois et japonais, ce qui convient aux scénarios simples.
Dans les applications pratiques, il est recommandé d'utiliser des polices TrueType et Imagettfbbox pour mesurer la largeur de la chaîne pour améliorer l'effet de rendu de texte.