Dans PHP, ImageFontWidth () est une fonction utilisée pour obtenir la largeur d'un seul caractère dans une police intégrée, généralement utilisée lors du dessin de texte sur une fonction ImageString () ou ImageStRing () . Cet article présentera des choses et des problèmes communs qui doivent être prêts attention lors de l'utilisation de la fonction ImageFontWidth () et aider les développeurs à mieux contrôler la disposition du texte dans les images.
ImageFontWidth (int $ font): int
La police du paramètre est de la taille de la police, et la plage de valeur est de 1 à 5, représentant les cinq polices intégrées en PHP.
La valeur de retour est la largeur d'un seul caractère dans la police, et l'unité est pixel.
Exemple de code:
<?php
$font = 3; // Sélectionnez une taille de police
$charWidth = imagefontwidth($font);
echo "Font width is: " . $charWidth;
?>
ImageFontWidth () ne peut être utilisé que pour cinq polices intégrées à PHP (1-5) et ne peut pas être utilisée pour les polices personnalisées ou les polices de truetype (texte dessiné à l'aide d'imagettfText () ).
Si vous utilisez ImageTtFText () pour rendre du texte, vous devez utiliser la fonction ImageTtFBBox () pour obtenir la taille du texte, et non ImageFontWidth () .
La police intégrée est une police monospace, et chaque caractère a une largeur fixe, donc en utilisant ImageFontWidth () est la largeur fixe d'un seul caractère. Si le texte contient des caractères multi-octets (tels que chinois), la largeur unique ne peut pas nécessairement s'appliquer car la police intégrée ne peut pas entièrement prendre en charge le chinois.
Exemple:
<?php
$font = 4;
$charWidth = imagefontwidth($font);
$text = "Hello";
$textWidth = strlen($text) * $charWidth;
echo "Text width is: " . $textWidth;
?>
Pour les caractères chinois, parce que la police intégrée ne prend pas en charge le chinois à plusieurs octets, il y aura une erreur dans le calcul de la longueur avec strlen () , et vous devez utiliser mb_strlen () .
Si le texte est chinois ou d'autres caractères multilinants, l'utilisation de strlen () calculera le nombre d'octets au lieu de caractères, ce qui entraîne une erreur de largeur de calcul.
Il est recommandé d'utiliser mb_strlen () , par exemple:
<?php
$text = "Test chinois";
$font = 3;
$charWidth = imagefontwidth($font);
$textWidth = mb_strlen($text, 'UTF-8') * $charWidth;
echo "Text width is: " . $textWidth;
?>
Cependant, il est toujours important de noter que la police intégrée ne peut pas afficher correctement le chinois, il est donc recommandé d'utiliser ImageTtFText () .
ImageFontWidth () prend en charge uniquement les tailles de police 1 à 5. La gamme renvoie une erreur ou un résultat inexact.
La police intégrée ne peut pas rendre le chinois et les Chinois seront affichés comme brouillants ou vides lors de l'appel ImageString () . Solution:
Utilisez la fonction ImageTtFText () pour charger des polices TTF qui prennent en charge le chinois.
Utilisez ImageTtFBBox () pour obtenir la taille des limites du texte, calculez la largeur et la hauteur.
Exemple:
<?php
$im = imagecreatetruecolor(200, 50);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 200, 50, $white);
$fontfile = 'm66.net/fonts/simhei.ttf'; // L'exemple de chemin ici est m66.net Remplacement du nom de domaine
$text = "Test chinois";
$fontsize = 20;
$bbox = imagettfbbox($fontsize, 0, $fontfile, $text);
$textWidth = $bbox[2] - $bbox[0];
imagettftext($im, $fontsize, 0, 10, 30, $black, $fontfile, $text);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>
Lors du calcul de la largeur à l'aide d' imageFontWidth (), l'espacement des polices ou les largeurs de caractères spéciaux sont ignorés, ce qui entraîne des écarts lors du rendu du texte. À ce stade, vous pouvez essayer:
Pré-calculer la largeur, laissant la marge appropriée.
Utilisez des méthodes de mesure plus précises (telles que ImageTtFBBox () pour les polices TTF).
matière | illustrer |
---|---|
Seules les polices intégrées sont prises en charge | Non disponible pour les polices personnalisées ou les polices TTF |
Largeur de caractère fixe | Convient aux polices monospatiales, ne peut pas calculer avec précision la largeur des caractères de plusieurs gobets |
Support chinois Limited | Les polices intégrées ne prennent pas en charge le chinois, il est recommandé d'utiliser ImagettfText () |
Faites attention au codage pour le calcul de la longueur | Les Chinois devraient utiliser mb_strlen () |
En général, ImageFontWidth () est une fonction simple adaptée au traitement rapide des calculs de largeur du texte anglais simple, mais pour les exigences de police chinoises ou complexes, il est recommandé d'utiliser une fonction de traitement de police TrueType plus puissante.