Position actuelle: Accueil> Derniers articles> Pourquoi ImageFontWidth () renvoie-t-il toujours la mauvaise largeur?

Pourquoi ImageFontWidth () renvoie-t-il toujours la mauvaise largeur?

M66 2025-06-04

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.

Qu'est-ce que ImageFontWidth () ?

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

Malentendus communs et faute

Les problèmes se produisent généralement dans les aspects suivants:

1. Malententure du type de police

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.

2. Ignorez la largeur totale des caractères

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');

3. Police ne se charge pas correctement

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.

Comment obtenir correctement la largeur des chaînes?

Situation 1: Utilisez des polices bitmap intégrées GD

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);

Situation 2: Utilisez la police TrueType

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.

Exemple d'application: dessinez dynamiquement des images avec du texte

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

Conseils

  • 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

Résumer

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.