A en juger par votre utilisation de cette constante ASSETPATH
à la fois pour vous URI image ainsi que le chemin fontfile dans imagettftext Je ne peux supposer que vous avez votre fontfile stocké dans le même chemin que celui de votre image?
Si ce n'est pas le cas, ou que le fichier n'a pas pu être ouvert, PHP affichera un avertissement de imagettftext(): Invalid font filename
. Si display_errors est réglé sur Sur dans votre php.ini (vous pouvez vérifier phpinfo pour vérifier cela) cela signifie que le message d'erreur sera envoyé au flux de sortie avec vos données d'image (par exemple, corrompre les données d'image et provoquer votre navigateur pour afficher l'image). Cela empêcherait également les en-têtes d'être modifiés puisque l'erreur aurait eu lieu avant votre appel à l'en-tête.
Toutefois, si display_errors ne sont pas activés et PHP n'a pas pu trouver le fontfile ou que vous avez fourni, il ne pouvait pas être ouvert pour une raison quelconque (par exemple autorisations) le résultat sera une image PNG 170x60 blanc.
Si je teste votre code localement, il s'avère fonctionner comme prévu, tant que je fournis à PHP le chemin absolu correct vers mon fichier de police TrueType. Par exemple, j'ai quelques polices TrueType sur mon système stockées à /usr/share/fonts/truetype/
, ce qui n'est certainement pas dans mon site web car je ne conserve pas mes fichiers de police normalement. Notez également que mon utilisateur PHP dispose de autorisations suffisantes pour lire à partir de ce chemin.
Maintenant, si je l'offre PHP avec le chemin absolu correct au fichier de police TrueType que je voudrais utiliser j'obtenir l'image en utilisant votre code ...
$string = '';
for ($i = 0; $i < 5; $i++) {
// this numbers refer to numbers of the ascii table (lower case)
$string .= chr(rand(97, 122));
}
$image = imagecreatetruecolor(170, 60);
$color = imagecolorallocate($image, 200, 100, 90); // red
$white = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image,0,0,399,99,$white);
imagettftext ($image, 30, 0, 10, 40, $color, '/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-ExtraLight.ttf', $string);
header("Content-type: image/png");
imagepng($image);
Qu'est-ce que vous devriez essayer de faire pour déboguer ceci est exécuté le script PHP qui génère l'image par lui-même, avec display_errors activé et error_reporting mis à -1
et si c'est effectivement le cas que votre fichier de police est le problème, vous verrez ce dans votre error_log ou dans la sortie d'erreur affichée pendant testin g ce script avec display_errors activé.
Si vous devez utiliser un CAPTCHA, profitez d'un service comme reCAPTCHA - les CAPTCHA générés par votre script personnalisé (texte brut sur fond blanc) seront triviaux à casser. – leepowers