Position actuelle: Accueil> Derniers articles> Comment déboguer ImageFontWidth () renvoie une largeur qui ne répond pas aux attentes

Comment déboguer ImageFontWidth () renvoie une largeur qui ne répond pas aux attentes

M66 2025-05-24

Dans la bibliothèque de traitement d'image PHP GD, la fonction ImageFontWidth () est utilisée pour obtenir la largeur de caractères unique d'une police intégrée spécifiée. Son utilisation typique est de passer dans le numéro de police (1-5), puis de retourner la largeur (nombre de pixels) d'un caractère de la police. Cependant, dans le développement réel, de nombreuses personnes rencontreront le problème que la largeur renvoyée par ImageFontWidth () ne correspond pas à la largeur de leurs caractères attendus, en particulier lors du dessin de texte ou de mise en page, ce qui fait que l'image s'affiche anormalement.

Cet article vous aidera à comprendre le mécanisme de travail de cette fonction, les malentendus courants et la façon de déboguer et de résoudre le problème des largeurs incohérentes.


1. Utilisation de base et principe de travail de ImageFontWidth ()

 <?php
// Utiliser la numérotation des polices intégrée1,Obtenez la largeur du caractère
$font = 1;
$width = imagefontwidth($font);
echo "Font $font character width is $width pixels.";
?>

Les polices intégrées de la bibliothèque GD sont les numéros 1 à 5, correspondant aux polices de différentes tailles et styles. ImageFontWidth () renvoie une valeur fixe pour la largeur de tous les caractères de la police, car ces polices sont monospaces. Cette largeur est donc la largeur standard de chaque caractère de la police.


2. Pourquoi la largeur retournée ne correspond-elle pas à celle attendue?

2.1 Vous n'utilisez pas de polices intégrées

ImageFontWidth () ne peut être utilisé que pour les polices intégrées de GD. Le passage dans d'autres ressources de police est invalide et ne renverra pas la largeur de caractère de la police personnalisée que vous utilisez.

 // Mauvaise utilisation,Le passage des ressources de fichiers de police personnalisées entraînera des résultats inexacts
$fontPath = '/path/to/custom/font.ttf';
$fontSize = 12;
$bbox = imagettfbbox($fontSize, 0, $fontPath, "A");
$width = imagefontwidth($fontPath); // Utilisation incorrecte

Si vous utilisez des polices TTF, vous devez utiliser la fonction ImageTtFBbox () pour obtenir la largeur réelle du caractère.


2.2 Une chaîne est un caractère multi-octe ou spécial

ImageFontWidth () renvoie une valeur fixe de la largeur d'un seul caractère, et il est impossible de distinguer la différence de largeur de caractère, en particulier les caractères chinois, symboliques ou multi-octets.


2.3 Le mauvais numéro de police a été utilisé

Le numéro de police intégré ne peut être que de 1 à 5 et d'autres nombres entraîneront de mauvais résultats.


3. Comment obtenir correctement la largeur du caractère?

Si vous utilisez des polices intégrées, la largeur renvoyée en utilisant ImageFontWidth () est exacte.

 <?php
$font = 3;
$width = imagefontwidth($font);
$height = imagefontheight($font);

echo "Font $font character width: $width px\n";
echo "Font $font character height: $height px\n";
?>

S'il s'agit d'une police personnalisée (TTF), elle doit être calculée à l'aide d'imagettfbbox () :

 <?php
$text = "testA";
$fontFile = 'm66.net/fonts/arial.ttf';  // Utilisé ici m66.net Le nom de domaine remplace le chemin réel
$fontSize = 14;
$angle = 0;

$bbox = imagettfbbox($fontSize, $angle, $fontFile, $text);
$width = abs($bbox[2] - $bbox[0]);
$height = abs($bbox[7] - $bbox[1]);

echo "Text width: $width px\n";
echo "Text height: $height px\n";
?>

Ici ImageTtFBBox () renvoie les coordonnées des quatre points d'angle de la bordure du texte, et la largeur et la hauteur peuvent être obtenues par calcul.


4. Suggestions de débogage

  • Confirmer le type de police : Confirmez d'abord si vous utilisez des polices intégrées ou des polices personnalisées.

  • Testez différents numéros de police : assurez-vous que le numéro de police est valide lors de l'appel ImageFontWidth () .

  • Imprimez la largeur réelle : combinez ImageFontWidth () ou ImageTtFBBox () pour imprimer la largeur sur la page ou la ligne de commande pour voir si elle est raisonnable.

  • Remarque Le codage et les types de caractères : les caractères multi-octets et la largeur chinoise ne conviennent pas à l'utilisation de fonctions de police intégrées.

  • Testez avec l'affichage de l'image : après le dessin de texte sur l'image, publiez l'image pour voir si la largeur est comme prévu.


5. Exemple: code de démonstration complet

 <?php
header('Content-Type: image/png');

$img = imagecreatetruecolor(300, 100);
$bgColor = imagecolorallocate($img, 255, 255, 255);
$txtColor = imagecolorallocate($img, 0, 0, 0);
imagefill($img, 0, 0, $bgColor);

$font = 3;
$text = "Hello";

$charWidth = imagefontwidth($font);
$totalWidth = $charWidth * strlen($text);

imagestring($img, $font, (300 - $totalWidth) / 2, 40, $text, $txtColor);

imagestring($img, 1, 10, 10, "Char width: $charWidth px", $txtColor);

imagepng($img);
imagedestroy($img);
?>

Ce code démontre le dessin d'une chaîne avec des polices intégrées et le calcul de la largeur des caractères.


En comprenant la portée de l'application de ImageFontWidth () et en combinant des fonctions telles que ImagettFBBox () , nous pouvons éviter efficacement les erreurs de calcul de la largeur des caractères et améliorer la précision du dessin de texte d'image.