Lorsque nous utilisons PHP pour traiter les images, nous utilisons souvent la fonction ImageFontWidth () pour obtenir la largeur de caractère d'une taille de police spécifique, calculant ainsi les espaces réservés exacts du texte dans l'image. Cependant, de nombreux développeurs rencontreront un problème gênant: la largeur renvoyée par ImageFontWidth () ne correspond toujours pas à l'effet d'affichage réel, ce qui entraîne une position texte confuse ou tronquée. Cet article analysera les causes de ce problème en profondeur et fournira une solution fiable.
ImageFontWidth (int $ FONT) est l'une des fonctions fournies par la bibliothèque PHP GD pour obtenir la largeur des pixels d'un caractère dans une taille de police spécifiée. Il ne fonctionne qu'avec des polices bitmap intégrées dans la bibliothèque GD, et la taille de la police est généralement une valeur entière (1 à 5).
Exemple de code:
$width = imagefontwidth(5);
echo "La largeur de la police est:$width Pixels";
Les problèmes se produisent généralement dans les aspects suivants:
ImageFontWidth () n'est valide que pour les polices bitmap intégrées et n'est pas applicable aux polices TrueType (TTFS). De nombreux développeurs utilisent ImageTtFText () pour rendre incorrectement les polices TTF, ce qui conduira inévitablement à de mauvais résultats.
Même si vous utilisez des polices intégrées, n'oubliez pas que ImageFontWidth () renvoie la largeur d'un seul caractère. Si vous rendez une chaîne entière, vous devez multiplier par la longueur de la chaîne:
$font = 5;
$text = "Hello";
$width = imagefontwidth($font) * strlen($text);
Si la chaîne contient des caractères multilinaires (comme le chinois), la longueur renvoyée par strlen () sera inexacte, et vous devez utiliser MB_Strlen () à la place:
$width = imagefontwidth($font) * mb_strlen($text, 'UTF-8');
Bien que les polices bitmap de PHP n'ayent pas besoin d'être chargées manuellement, si vous utilisez un chemin de police personnalisé ou une police système, différentes fonctions de rendu peuvent être mitigées, entraînant une erreur de compréhension.
Utilisez ImageFontWidth () directement pour vous assurer que le numéro de police est dans la plage de 1 ~ 5 et utilisez strlen () ou mb_strlen () :
$font = 3;
$text = "Welcome";
$width = imagefontwidth($font) * strlen($text);
Pour les polices TTF, ImageFontWidth () n'est pas valide. Vous devez utiliser ImageTtFBBox () pour obtenir la boîte de délimitation de la chaîne sous la police spécifiée, puis calculer la largeur en fonction des coordonnées:
$fontFile = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
$fontSize = 14;
$text = "Welcome";
$bbox = imagettfbbox($fontSize, 0, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
Dans cet exemple, $ bbox renvoie un tableau de 8 éléments représentant les quatre coins de la frontière de texte. La largeur peut être calculée par la différence de l'axe horizontal entre le coin supérieur droit et le coin supérieur gauche.
$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);
De cette façon, nous nous assurons que même les polices TTF obtiennent une largeur précise et une position de centrage.
Ne mélangez pas ImageString () et ImageTtfText () : ils conviennent respectivement aux polices Bitmap et TTF.
Le résultat renvoyé par ImageFontWidth () n'est pas affecté par les paramètres DPI, mais Imagettfbbox () calcule les pixels logiques et est affecté par les fichiers de police.
Si vous êtes déployé sur un autre serveur, assurez-vous de confirmer que le chemin du fichier de police existe et est accessible. Par exemple: https://m66.net/fonts/dejavusans.ttf
Lorsque ImageFontWidth () renvoie la mauvaise largeur, la plupart des cas sont dus à l'utilisation de types de polices incompatibles ou à ignorer le produit du nombre total de caractères. Comprendre la portée de cette fonction et utiliser Imagettfbbox () à la place lorsqu'il s'agit de polices TTF est la clé pour résoudre le problème. Ce n'est qu'en sélectionnant correctement les outils que vous pouvez obtenir la disposition et l'effet précis souhaités lors du traitement des images.