Lorsque vous utilisez la bibliothèque GD de PHP pour le traitement d'image, la fonction ImageFontWidth () est souvent utilisée pour obtenir la largeur des polices intégrées pour le positionnement du texte et la typographie. Cependant, de nombreux développeurs ont constaté que la largeur de la police renvoyée par la fonction ImageFontWidth () est parfois inexacte, ce qui entraîne l'affichage de texte qui ne répond pas aux attentes. Cet article analysera les causes de ce problème en profondeur et fournira des solutions efficaces.
La fonction ImageFontWidth () prend un paramètre entier qui représente la taille de la police intégrée (1 à 5) et renvoie la largeur d'un caractère dans cette police (en pixels). Ces polices intégrées sont intégrées dans la bibliothèque PHP GD, et le style de police est fixe et ne peut pas être personnalisé.
<?php
$font = 3; // Taille de la police,portée1~5
$width = imagefontwidth($font);
echo "La largeur de la police est:" . $width;
?>
La fonction renvoie la largeur moyenne de la police, généralement le nombre de pixels d'un seul caractère fixe.
Bien que la police intégrée soit une police à largeur fixe, certains personnages ne sont pas strictement cohérents dans leurs pixels réels. Par exemple, les caractères d'espace ou les symboles spéciaux peuvent être rendus plus compacts, ce qui entraîne la largeur réelle qui ne correspond pas à la valeur renvoyée par ImageFontWidth () .
ImageFontWidth () ne prend en charge que cinq tailles de police intégrées et ne prend pas en charge les tailles de police personnalisées. Si vous utilisez une police personnalisée (comme TTF), la fonction ne peut pas mesurer la largeur exacte et la valeur obtenue en l'appelant est naturellement inexacte.
ImageFontWidth () obtient une largeur de caractères, quel que soit l'espacement des caractères, les différences de largeur des caractères chinois ou multi-octets. Si vous l'utilisez pour calculer les caractères multi -yte ou élargir les polices, des erreurs se produiront.
Si vous évoluez l'image sans synchroniser la taille de la police, la largeur obtenue par ImageFontWidth () ne s'appliquera pas à l'image actuelle, entraînant une incohérence visuelle.
Pour les polices et tailles personnalisées, la fonction ImageTtFBBox () est recommandée. Il renvoie un tableau de quatre coordonnées d'angle du texte, et la largeur du texte exacte peut être obtenue en calculant la différence de coordonnées.
<?php
$text = "Tester le texte";
$fontFile = "/path/to/font.ttf";
$fontSize = 16;
// Obtenez la boîte de délimitation du texte
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
echo "La largeur du texte est:" . $width;
?>
Les polices intégrées conviennent principalement aux caractères anglais à un octet. Pour les caractères multi-octets tels que le chinois, il est recommandé d'utiliser des polices TrueType avec ImageTtFText () pour dessiner du texte, puis utiliser ImageTtFBBox () pour obtenir la largeur.
Lorsque vous utilisez des polices intégrées et une faible tolérance pour les erreurs de largeur, vous pouvez ajuster manuellement la position de départ du dessin de caractère par plusieurs tests et mesurer la largeur de différents caractères.
Assurez-vous que le rapport de mise à l'échelle et la taille de la police de l'image sont synchronisés pour éviter les erreurs visuelles causées par la mise à l'échelle.
En résumé, la fonction ImageFontWidth () ne convient qu'aux polices fixes intégrées et ne peut renvoyer que des largeurs moyennes, et n'est pas applicable pour les polices personnalisées et les scénarios de texte complexes. Il est recommandé d'utiliser ImageTtFBBox () pour calculer la largeur réelle pour assurer la précision de la disposition du texte.