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.
<?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.
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.
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.
Le numéro de police intégré ne peut être que de 1 à 5 et d'autres nombres entraîneront de mauvais résultats.
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.
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.
<?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.